Select 基于公共列值的多行 Oracle SQL

Select Multiple Rows Based On Common Column Value Oracle SQL

我有一个用户 table 说:

ID 姓名 Ref_ID 活跃
1 ABC 100 1
2 BCD 200 0
3 CDE 300 1
4 防御 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 和 inner join 查询,但无法正确使用它们。

您可以使用 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
                 );

或window函数:

select t.*
from (select t.*,
             max(active) over (partition by ref_id) as max_active
      from t
     ) t
where max_active = 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);