我有两个表emp和type。
create table EMP(ID number(10), effective_date date);
EID Effective_date
--------------------
1 02/14/2023
2 02/15/2023
3 04/30/2023
4 03/24/2023
create table type(ID number(10),contract_type varchar2(2));
TID contract_type
------------------
1 P
1 S
1 P
2 S
2 S
3 P
3 S
4 S
我正在类型表中查找合同类型为“S”的EID。(或生效日期晚于系统日期的emp表,且类型表中只有contract_type =“S”)
实际结果:
第二章
4
我的查询没有给出正确的结果。
select emp.EID
from emp,type
where EID = TID
contract_type ='S'
effective_date >= sysdate
group by TID
having count(TID) >= 1;
2条答案
按热度按时间h4cxqtbf1#
我在这里使用存在逻辑:
laik7k3q2#
如果你想保留你的想法与
COUNT
和GROUP BY
,你应该计算其他合同类型比'S'的,并检查这是0:此查询将为示例数据返回2和4。
试用:db<>fiddle
另一个选项是如这里所述的使用
NOT EXISTS
。注意与
NOT EXISTS
方法的以下差异:Tim答案中的查询也会获取表“type”中根本没有出现的表“emp”的id,我这里的查询不会获取这样的id。这取决于你来决定这是否可能,以及在这种情况下该怎么做。
在上述查询中将
JOIN
更改为LEFT JOIN
将消除此差异。