我有一个简单的一对多关系。我想只在父母至少有一个孩子时从父母那里选择行。因此,如果没有子节点,则不在结果集中返回父行。
例如
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|
+----+------+
答案 0 :(得分:19)
您可以使用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)
答案 1 :(得分:12)
inner join
仅返回与两个表匹配的行:
select distinct p.*
from Parent p
inner join Children c on c.parent = p.id
答案 2 :(得分:2)
Select p.id, p.text
from Parent p
inner join Children c on p.id = c.parent
group by p.id, p.text
答案 3 :(得分:1)
SELECT p.*
FROM Parent p
WHERE EXISTS (SELECT 'X' FROM Children c WHERE c.parent = p.id);