基于公共列值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选择多行的主要内容,如果未能解决你的问题,请参考以下文章
如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL