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

Posted

技术标签:

【中文标题】基于公共列值Oracle SQL选择多行【英文标题】:Select Multiple Rows Based On Common Column Value Oracle SQL 【发布时间】:2021-09-18 20:42:18 【问题描述】:

我有一个用户表说:

ID Name Ref_ID Active
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 Name
2 BCD
6 FGH
7 GHI

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

【问题讨论】:

【参考方案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;

【讨论】:

【参考方案2】:

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

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);

【讨论】:

以上是关于基于公共列值Oracle SQL选择多行的主要内容,如果未能解决你的问题,请参考以下文章

用于连接 Oracle 中多行的列值的 SQL 查询

SQL / Hive 选择具有特定列值的第一行

Oracle SQL 排除特定类型的多行选择精确的两行

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

Laravel - 查询构建器以选择具有唯一列值的多行(具有另一列的最大值)

oracle sql查询以获取没有空格的列值