基于公共列值选择多行 Oracle SQL

时间:2021-07-08 11:20:22

标签: sql oracle join group-by having

我有一个用户表说:

<头>
ID 姓名 Ref_ID 活跃
1 ABC 100 1
2 BCD 200 0
3 CDE 300 1
4 DEF 300 0
5 EFG 300 1
6 FGH 400 0
7 GHI 400 0
8 HIJ 500 1
9 IJK 500 1

我想在同一 Ref_ID 下查找全部不活动的用户的 ID 和名称。 我的意思是说,例如有 3 个用户的 Ref_ID = 300 并且并非所有用户都处于非活动状态,因此我不希望这些用户出现在结果中。对于 Ref_ID = 400 的用户,所有用户都处于非活动状态,因此我希望他们在结果集中。 我正在尝试实现与此类似的结果:

<头>
ID 姓名
2 BCD
6 FGH
7 GHI

我怎样才能做到这一点?我曾尝试使用 group by 和内部连接查询,但无法正确使用。

2 个答案:

答案 0 :(得分:1)

您可以使用not exists

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.ref_id = t.ref_id and t2.active = 1
                 );

或窗口函数:

select t.*
from (select t.*,
             max(active) over (partition by ref_id) as max_active
      from t
     ) t
where max_active = 0;

答案 1 :(得分:0)

我们可以在这里使用聚合:

SELECT ID, Name
FROM yourTable
WHERE Ref_ID IN (SELECT Ref_ID
                 FROM yourTable
                 GROUP BY Ref_ID
                 HAVING COUNT(CASE WHEN Active = 1 THEN 1 END) = 0);
相关问题