如果至少有一个孩子,如何选择父行?

时间:2010-04-03 16:15:51

标签: sql select mysql one-to-many

我有一个简单的一对多关系。我想只在父母至少有一个孩子时从父母那里选择行。因此,如果没有子节点,则不在结果集中返回父行。

例如

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|
+----+------+

4 个答案:

答案 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);