2017-02-24 91 views
2

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

,但我的查询将也返回行的地方e table_a.primary_key = 5.

基本上我想返回的唯一行是当table_A.primary_key = 2时,因为级别很低,并且两个子行都有一个相等于close的相位。

谢谢!

+0

你有没有尝试* *正是这样的,用的话'low'和'close'不包括在单 - 引用,仍然有结果?这甚至不应该编译(你应该得到一个“无效标识符”错误)。 – mathguy

+0

不,对不起,我报价低,并关闭。我有问题试图完全按照它在这里的方式发布。 – confusedbeginner

+0

修复了报价 –

回答

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

感谢您的帮助!这也是一个很好的选择 – confusedbeginner

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值是允许的,逻辑是不完全等同。)

+0

是的,非常感谢!那么你能帮助解释这种情况下不存在的作品吗? – confusedbeginner

+0

我注意到你有'选择。*',有没有办法让输出获得来自两个表的所有数据? – confusedbeginner

相关问题