Подтвердить что ты не робот

Как выбрать родительскую строку, только если есть хотя бы один ребенок?

У меня есть простые отношения "один ко многим". Я хотел бы выбрать строки из родителя, только если у них есть хотя бы один ребенок. Итак, если детей нет, то родительская строка не возвращается в результирующем наборе.

Eg.

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

Ответ 1

Вы можете сделать это, используя 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

An inner join возвращает только строки, соответствующие обеим таблицам:

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

Ответ 3

Select p.id, p.text
from Parent p
inner join Children c on p.id = c.parent 
group by p.id, p.text

Ответ 4

SELECT p.*
FROM Parent p
WHERE EXISTS (SELECT 'X' FROM Children c WHERE c.parent = p.id);