首页 > 解决方案 > 基于公共列值Oracle SQL选择多行

问题描述

我有一个用户表说:

ID 姓名 Ref_ID 积极的
1 美国广播公司 100 1
2 BCD 200 0
3 CDE 300 1
4 国防军 300 0
5 EFG 300 1
6 生长激素 400 0
7 全球健康指数 400 0
8 HIJ 500 1
9 伊克 500 1

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

ID 姓名
2 BCD
6 生长激素
7 全球健康指数

我怎样才能做到这一点?我曾尝试使用 group by 和 inner join 查询,但无法正确使用它们。

标签: sqloraclejoingroup-byhaving

解决方案


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

推荐阅读