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);
我有一个用户 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);