Как выбрать родительскую строку, только если есть хотя бы один ребенок?
У меня есть простые отношения "один ко многим". Я хотел бы выбрать строки из родителя, только если у них есть хотя бы один ребенок. Итак, если детей нет, то родительская строка не возвращается в результирующем наборе.
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|
+----+------+
Ответы
Ответ 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);