如果所有孩子都符合条件,则选择父母

Posted

技术标签:

【中文标题】如果所有孩子都符合条件,则选择父母【英文标题】:Select parent if all children meet criteria 【发布时间】:2012-08-22 14:12:32 【问题描述】:

我的表是这样设置的:

Parent
------
id, ...

Child
-----
id, parent_id, x, y

如果 Child 中包含给定 parent_id 的行的 所有 符合涉及 x 和 y 的条件(在我的情况下为 x = y )。

例如:

Parent
------
id
 1
 2
 3

Child
id, parent_id, x, y
1,      1,     2, 3
2,      1,     3, 4
3,      2,     5, 5
4,      2,     6, 7
5,      3,     8, 8
6,      3,     9, 9

将导致 3。目前,我有一个查询,可以找到 任何 个子项符合条件的 parent_ids。然后,如果所有孩子都符合标准,我会使用它来检索这些记录并在代码中检查它们。使用示例数据,我得到 parent_id 2 和 3,得到两个包含所有子项的父记录,并进行评估。如果可能的话,我想用一个查询来做到这一点。

【问题讨论】:

你能告诉你预期的输出是什么吗? @AnandPhadke,我的预期输出是 3。 您使用的是哪个 DBMS? PostgreSQL?甲骨文? DB2? @a_horse_with_no_name,MS SQL Server。 SQL Server 的哪个版本? 2000、2005、2008、2008 R2、2012?您是否有多个级别的父/子级或只有一个级别,如示例数据所示? 【参考方案1】:

你可以使用NOT EXISTS

SELECT id 
FROM Parent p
WHERE NOT EXISTS
(
   SELECT 1 FROM Child c
   WHERE c.parent_Id = p.id
   AND c.x <> c.y
)

编辑:这是 sql-fiddle:http://sqlfiddle.com/#!3/20128/1/0

【讨论】:

我有一个类似的案例,我需要得到所有父母,但在一个列中显示谁符合儿童标准。我使用左联接(选择 1 作为 a,p2.id 从父 p2 中不存在(从子 c2 中选择 1,其中 c2.parent_Id = p2.id 和 c2.test = 'f')并且存在(从子中选择 1 c2 WHERE c2.parent_Id = p2.id AND c2.test = 't' ) ) cOK ON cOK.id = p.id 没有子查询就没有办法实现这一点吗?在大型数据集上表现不佳。【参考方案2】:

应该先加入2张桌子,因为父母没有满足的孩子

并且应该为 pa_id 列添加索引

SELECT DISTINCT pa.id 
FROM pa INNER JOIN c ON c.pa_id = pa.id 
WHERE NOT EXISTS ( SELECT 1 FROM c WHERE c.parent_Id = p.id and c.x <> c.y )

【讨论】:

【参考方案3】:

这是你需要的吗?

  select id from parent where id not in(
    select parent_id from child 
    where x<>y
    group by parent_id)

【讨论】:

【参考方案4】:

老问题,但我认为在这个话题上给我 5 美分是值得的。我相信更有效的方法是使用 HAVING 子句:

SELECT 
   Parent.id
FROM
   Parent 
   JOIN Child ON Child.parent_id = Parent.id
GROUP BY
   Parent.id
HAVING
   SUM( CASE WHEN Child.x = Child.y THEN 1 ELSE 0 END) = COUNT( * )

【讨论】:

以上是关于如果所有孩子都符合条件,则选择父母的主要内容,如果未能解决你的问题,请参考以下文章

TSQL:根据孩子的条件选择父母

如何选择名字等于孩子名字的父母

一对多查询为每个父母选择所有父母和单个***孩子

jquery选择器需要选择父母的所有某些孩子

如果孩子有特定的班级,Sass 选择父母

H5新增API