2013-09-30 191 views
0

比方說,我有兩個相關的表parentschildren與一對多的關係(一個parent到很多children)。通常,當我需要處理這些表上的信息一起,我做一個查詢,如下面的(用WHERE條款通常加入):在SQL中,如何選擇所有有孩子的父母?

SELECT * FROM parents INNER JOIN children ON (parents.id = children.parent_id); 

我怎麼能選擇具有至少一個child所有parents沒有浪費時間加入所有children到他們的parents

我正在考慮使用某種OUTER JOIN,但我不確定如何處理它。

(請注意,我問這個問題一般,所以不給我,被綁定到特定的RDBMS實現一個答案,除非沒有通用的解決方案。)

+0

做一個'LEFT JOIN'並過濾一些子字段(例如Name)爲NOT NULL。要讓每個父代只有一次需要使用DISTINCT或(如果有意義)「GROUP BY」。 –

+0

@ PM77-1謝謝!我使用'GROUP BY'工作,但我不確定如何使用'DISTINCT'。另外,你可以將它作爲答案嗎? – Matt

回答

2

正如我前面提出的意見中:

解決方案與LEFT JOINGROUP BY

SELECT p.parents.id FROM parents p 
LEFT JOIN children c ON (p.parents.id = c.children.parent_id) 
WHERE children.parent_id IS NOT NULL 
GROUP BY p.parents_id 

同樣與DISTINCT

SELECT DISTINCT p.parents.id FROM parents p 
LEFT JOIN children c ON (p.parents.id = c.children.parent_id) 
WHERE children.parent_id IS NOT NULL 

應該在大多數SQL方言工作,雖然有些需要as分配table aliases時。

以上是不是測試。希望我沒有錯別字。

+0

在這種情況下甚至需要表別名? – Matt

+0

不是。您可以像使用代碼一樣使用真實的表名。我只是習慣擁有它們,因爲它看起來更清潔。 –

0

試試這個

select parent_id,(select count(1) from children where parent_id = x.parent_id) 
from parent x where 
(select count(1) from children where parent_id = x.parent_id) > 0 
+0

不是子查詢通常很慢嗎? – Matt

+0

把時間和比較。子查詢只是對行進行計數,它與連接表相似。 – maSTAShuFu

2

我認爲,這避免了JOIN最簡單的解決辦法是:

SELECT * FROM parents WHERE id IN (SELECT parent_id FROM children);