SQL query group by and having all

5

我有一个表格:

Parent Child Educated
'P1', 'C1', 'YES'
'P1', 'C2', 'YES'
'P1', 'C3', 'NO'
'P2', 'C11', 'YES'
'P2', 'C12', 'NO'
'P3', 'C21', 'YES'
'P3', 'C22', 'YES'
'P4', 'C31', 'NO'
'P4', 'C32', 'NO'

现在,我需要找到所有孩子都受过教育的父母,即 Educated='YES'。

就像上面的例子中的父母 'P3'

有人能建议一个查询来获取这个结果吗?


查找那些没有任何孩子受过教育的人 = 'no' - Strawberry
4个回答

8

我会这样做:

select parent
from t
group by parent
having max(educated) = min(educated) and max(educated) = 'YES';

如果educated可能是NULL,那么逻辑会稍微复杂一些。

实际上,如果值只是'YES''NO',你可以使用更简单的方法:

select parent
from t
group by parent
having min(educated) = 'YES';

1
答案的第二部分让我感到困惑。它不仅仅是一个快捷方式,而是另一种情况,请注意! - KarmaEDV

5
select parent, 
       sum(case when educated='YES' then 1 else 0 end) as sum_educated,
       count(*) as count_all
from t
group by parent
having count_all=sum_educated

在MySQL中,实际上您不需要使用CASE。 - Strawberry

1

查找具有“否定”记录的父级,并使用 NOT IN 将其从结果中删除:

SELECT parent
FROM table
WHERE parent NOT IN (SELECT parent FROM table WHERE Educated = 'No')
GROUP BY parent

1
你的妈妈从来没有告诉过你“不要对列表使用IN,除非你愿意手写它们的长度”吗? :) - Caius Jard

-3

从[YourTable]选择*

如果您只想显示 Parent 列 则从[YourTable]选择Parent 其中 Educated = 'Yes'


1
父级节点的所有子节点均为“是”。 - JNevill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接