当所有子记录满足条件时,仅选择父记录

时间:2017-02-24 12:58:11

标签: sql oracle exists

我有两个表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。

谢谢!

2 个答案:

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