我有两个表A和B,当所有孩子(表B中)符合标准时,我只想要父A行。如果B中的一行不符合标准,那么我就不需要父A行。我想我需要在这里使用存在,但不能显示如何。
以下是数据表:
表A
Primary Key Level
1 low
2 low
3 high
4 high
5 low
表B
Primary Key Phase Parent Primary Key
1 open 1
2 open 1
3 close 1
4 close 2
5 close 2
6 close 3
7 open 4
8 open 4
9 open 5
10 close 5
我正在尝试的查询:
select *
from table_a, table_b
where table_a.level = 'low' and
table_b.phase = 'close' and
table_a.primary_key=table_b.parent_primary_key
但我的查询也会返回table_a.primary_key = 5的行。
基本上我想要返回的唯一行是table_A.primary_key = 2因为级别低,并且两个子行的相位都等于close。
谢谢!
答案 0 :(得分:4)
这就是你想要的吗
select a.*
from table_a a
where a.level = 'low' and
not exists (select 1
from table_b b
where b.parent_primary_key = a.primary_key and
b.phase <> 'close'
);
not exists
是双重否定。它检查没有'close'
以外的阶段的孩子 - 这基本上相当于说所有孩子都是'close'
。 (如果允许NULL
值,则逻辑不完全等效。)
答案 1 :(得分:3)
可替换地:
select a.*
from table_a a
where a.level = 'low' and
'close' = all (select phase
from table_b b
where b.parent_primary_key = a.primary_key
);