2012-08-22 95 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) 
相關問題