如果所有孩子都符合条件,则选择父母
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( * )
【讨论】:
以上是关于如果所有孩子都符合条件,则选择父母的主要内容,如果未能解决你的问题,请参考以下文章