我有一个查询,它从多个表中提取数据,其中一个称为empl_access。我只需要s_system_cd类型为WEC的在职员工。

此字段有两个值:WECWTC。员工可以拥有两个,但是我希望只有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,但是我知道在极少数情况下可能需要使用较旧的语法。但是除此之外(您会知道是否找到它),坚持写出INNERLEFTCROSSFULLLATERAL等。

10-04 10:51