2010-04-03 91 views
12

我有一個簡單的一對多關係。我只想在父母至少有一個孩子時從父母中選擇行。所以,如果沒有孩子,那麼父行不會返回結果集中。如何僅在至少有一個孩子的情況下選擇父行?

例如,

Parent: 
+--+---------+ 
|id| text | 
+--+---------+ 
| 1| Blah | 
| 2| Blah2 | 
| 3| Blah3 | 
+--+---------+ 

Children 
+--+------+-------+ 
|id|parent| other | 
+--+------+-------+ 
| 1| 1 | blah | 
| 2| 1 | blah2 | 
| 3| 2 | blah3 | 
+--+------+-------+ 

我想要的結果是:

+----+------+ 
|p.id|p.text| 
+----+------+ 
| 1 | Blah | 
| 2 | Blah2| 
+----+------+ 

回答

15

您可以使用EXISTS做到這一點,是這樣的:

SELECT * 
FROM Parent p 
WHERE EXISTS (SELECT 1 
       FROM Chilren c 
       WHERE c.Parent = p.id) 

或使用IN這樣的:

SELECT * 
FROM Parent p 
WHERE p.id IN (SELECT c.Parent 
       FROM Chilren c) 
+2

我沒有測試過,但我猜測這是不是加入慢。 – Hogan 2010-04-03 16:22:49

+3

@霍根 - 存在它是最快的方法。優化器將爲空檢查的外連接執行相同的執行計劃......這將**作爲**快速,但存在永遠不會變慢。 – 2010-04-03 16:24:02

+0

整潔。謝謝@尼克。對於mysql,ms sql和oracle這是真的嗎? – Hogan 2010-04-04 16:35:23

1
SELECT p.* 
FROM Parent p 
WHERE EXISTS (SELECT 'X' FROM Children c WHERE c.parent = p.id); 
2
Select p.id, p.text 
from Parent p 
inner join Children c on p.id = c.parent 
group by p.id, p.text 
12

inner join只返回匹配兩個表的行:

select distinct p.* 
from Parent p 
inner join Children c on c.parent = p.id 
+1

在我看來,這是實現這個目標最直接的方法,應該是被接受的答案。 – adriandz 2013-08-14 17:35:40

相關問題