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

Mat*_*ick 15 mysql sql select 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 |
+--+------+-------+
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

+----+------+
|p.id|p.text|
+----+------+
|  1 | Blah |
|  2 | Blah2|
+----+------+
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 19

你可以这样做EXISTS,像这样:

SELECT *
FROM Parent p
WHERE EXISTS (SELECT 1
              FROM Chilren c
              WHERE c.Parent = p.id)
Run Code Online (Sandbox Code Playgroud)

或者使用IN这样的:

SELECT *
FROM Parent p
WHERE p.id IN (SELECT c.Parent
               FROM Chilren c)
Run Code Online (Sandbox Code Playgroud)

  • @Hogan - 存在它是最快的方法.优化器将对null检查的外连接执行相同的执行计划...这将**为**快,但存在从不慢. (5认同)
  • 我没有测试,但我猜这比连接慢. (3认同)

And*_*mar 12

一个inner join只返回匹配两个表的行:

select distinct p.*
from Parent p
inner join Children c on c.parent = p.id
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是实现这一目标的最直接的方法,并且应该是公认的答案。 (2认同)