当所有的孩子记录符合条件时,只选择父记录
我有两个表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的相位。
谢谢!
或者:
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
);
感谢您的帮助!这也是一个很好的选择 – confusedbeginner
这是你想要
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
值是允许的,逻辑是不完全等同。)
是的,非常感谢!那么你能帮助解释这种情况下不存在的作品吗? – confusedbeginner
我注意到你有'选择。*',有没有办法让输出获得来自两个表的所有数据? – confusedbeginner
你有没有尝试* *正是这样的,用的话'low'和'close'不包括在单 - 引用,仍然有结果?这甚至不应该编译(你应该得到一个“无效标识符”错误)。 – mathguy
不,对不起,我报价低,并关闭。我有问题试图完全按照它在这里的方式发布。 – confusedbeginner
修复了报价 –