oracle 如何比较同一列中的不同值

btqmn9zl  于 2023-01-08  发布在  Oracle
关注(0)|答案(2)|浏览(249)

我有两个表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;
h4cxqtbf

h4cxqtbf1#

我在这里使用存在逻辑:

SELECT EID
FROM EMP e
WHERE effective_date >= SYSDATE AND
      NOT EXISTS (
          SELECT 1
          FROM "type" t
          WHERE t.TID = e.EID AND
                t.contract_type <> 'S'
      );
laik7k3q

laik7k3q2#

如果你想保留你的想法与COUNTGROUP BY,你应该计算其他合同类型比'S'的,并检查这是0:

SELECT e.eid
FROM emp e 
JOIN type t ON e.eid = t.tid
WHERE 
e.effective_date >= sysdate
GROUP BY e.eid 
HAVING COUNT(CASE WHEN t.contract_type <> 'S' THEN 1 END) = 0;

此查询将为示例数据返回2和4。
试用:db<>fiddle
另一个选项是如这里所述的使用NOT EXISTS
注意与NOT EXISTS方法的以下差异:Tim答案中的查询也会获取表“type”中根本没有出现的表“emp”的id,我这里的查询不会获取这样的id。
这取决于你来决定这是否可能,以及在这种情况下该怎么做。
在上述查询中将JOIN更改为LEFT JOIN将消除此差异。

相关问题