У меня есть простая связь "один ко многим". Я хотел бы выбрать строки из родителя только, когда у них есть по крайней мере один ребенок. Так, при отсутствии детей, то родительская строка не возвращается в наборе результатов.
Например.
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|
+----+------+
Вы можете сделать это, используя 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)
Внутреннее соединение
возвращает только строки, соответствующие обеим таблицам:
select distinct p.*
from Parent p
inner join Children c on c.parent = p.id
Select p.id, p.text
from Parent p
inner join Children c on p.id = c.parent
group by p.id, p.text
SELECT p.*
FROM Parent p
WHERE EXISTS (SELECT 'X' FROM Children c WHERE c.parent = p.id);