Как выбрать родительскую строку, только если есть хотя бы один дочерний элемент? - PullRequest
15 голосов
/ 03 апреля 2010

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

Например.

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 ]

19 голосов
/ 03 апреля 2010

Вы можете сделать это, используя 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)
12 голосов
/ 03 апреля 2010

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

select distinct p.*
from Parent p
inner join Children c on c.parent = p.id
2 голосов
/ 03 апреля 2010
Select p.id, p.text
from Parent p
inner join Children c on p.id = c.parent 
group by p.id, p.text
1 голос
/ 03 апреля 2010
SELECT p.*
FROM Parent p
WHERE EXISTS (SELECT 'X' FROM Children c WHERE c.parent = p.id);
...