我有一个查询,它从多个表中提取数据,其中一个称为empl_access
。我只需要s_system_cd
类型为WEC
的在职员工。
此字段有两个值:WEC
和WTC
。员工可以拥有两个,但是我希望只有WEC
的员工。
到目前为止,这是我的脚本。这将拉出所有WEC
行,但其中一些也具有WTC
,我希望将它们过滤掉。
select DISTINCT a.empl_id, a.last_name, a.first_name, a.active_fl,
b.UDT09_ABBRV_ID, c.s_system_cd, count(a.empl_id) over ()
from empl a, V_TBE_MAX_EMPL_HISTORY b, empl_access c
where a.empl_id=b.empl_id
and a.empl_id=c.empl_id
and a.active_fl='Y'
and c.s_system_cd like 'WEC%'
order by a.empl_id;
这是表格中的示例:
empl_id |姓| first_name | udt09_abbr_id | s_system_cd
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000000 |鼠标|米奇| 1111 | WEC
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000000 |鼠标|米奇| 1111 |世界贸易中心
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000010 |鸭|唐纳德| 1111 | WEC
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000010 |鸭|唐纳德| 1111 |世界贸易中心
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000020 |派克约翰| 1150 | WEC
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000030 |史密斯|安妮| 1152 | WEC
这就是我要拉的
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
empl_id |姓| first_name | udt09_abbr_id | s_system_cd
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000020 |派克约翰| 1150 | WEC
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
000030 |史密斯|安妮| 1152 | WEC
----------- | ---------------- | ---------------- | ---- ----------------- | -----------------
最佳答案
SELECT DISTINCT a.empl_id, a.last_name, a.first_name, a.active_fl,
b.UDT09_ABBRV_ID, c.s_system_cd, count(a.empl_id) over ()
FROM empl a
INNER JOIN V_TBE_MAX_EMPL_HISTORY b ON a.empl_id=b.empl_id
INNER JOIN empl_access c ON a.empl_id=c.empl_id AND c.s_system_cd like 'WEC%'
LEFT JOIN empl_access c2 ON a.empl_id=c2.empl_id AND c2.s_system_cd like 'WTC%'
WHERE a.active_fl='Y' AND c2.empl_id IS NULL
ORDER BY a.empl_id;
您也可以通过
EXISTS
操作或GROUP BY
以及聚合函数的一些花哨技巧来完成此操作(其他答案中的min = max起作用;检查count = 1和max ='WEC'也是如此)。此答案中的示例是您应该如何总是 *写您的联接。
empl a, V_TBE_MAX_EMPL_HISTORY b, empl_access c
的东西是给鸟的。随着添加更多的表或条件,阅读和管理变得越来越困难,某些事情旧的语法是无法做到的,并且大约20年以来,旧的语法已被认为已经过时。*我不经常使用Oracle,但是我知道在极少数情况下可能需要使用较旧的语法。但是除此之外(您会知道是否找到它),坚持写出
INNER
,LEFT
,CROSS
,FULL
,LATERAL
等。