2012-08-22 97 views
7

我有表设置像这样:选择父母,如果所有的孩子符合条件

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

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

我想找到父母,或者不同PARENT_ID(S),如果包含在子行的所有给定的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,与所有孩子一起获得两条父记录,并进行评估。如果可能,我想用单个查询来完成此操作。

+0

你可以请告诉什么是乌拉圭回合的预期输出添加索引? – AnandPhadke

+0

@AnandPhadke,我的预期输出将是3. – CheeZe5

+0

您正在使用哪些DBMS? PostgreSQL的?甲骨文? DB2? –

回答

18

您可以使用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的小提琴:http://sqlfiddle.com/#!3/20128/1/0

+9

+1 for SQL小提琴......从来不知道存在......非常方便。 – Webjedi

+0

我有一个类似的案例,我需要让所有的父母,但在一个列表显示符合孩子的标准。我用LEFT JOIN( 选择1作为,p2.id从父P2 WHERE NOT EXISTS( 选择1从子C2 WHERE c2.parent_Id = p2.id AND c2.test = 'F' )AND EXISTS( SELECT 1 FROM Child c2 WHERE c2.parent_Id = p2.id AND c2.test ='t' ) )cOK ON cOK.id = p.id –

1

这是你需要什么?

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

应先加入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) 
相关问题