Выберите все строки, у которых нет детей

У меня действительно есть мозг-неудача на этом.

У меня есть следующая таблица:

id    parentID     name
1     0            Frank
2     1            Sally
3     1            John
4     3            Beth

Мне нужен оператор, который выбирает только те элементы, у которых нет детей, поэтому в предыдущем примере:

Sally
Beth

Был бы результат. Кажется, не получается найти запрос, чтобы сделать это, не создавая рекурсивную функцию, которую я не хочу делать, если можно избежать.

Ответ 1

select yt.name
    from YourTable yt
    where not exists (select null from YourTable where parentID = yt.id)

Хотя он менее эффективен (см. Левое внешнее соединение против NOT EXISTS), вы также можете сделать это с помощью левого соединения:

select yt1.name
    from YourTable yt1
        left join YourTable yt2
            on yt1.id = yt2.parentID
    where yt2.id is null

Ответ 2

select t.name
from that_table t
where t.id not in (select parentID from that_table);

Ответ 3

select person.ID, person.name
FROM table AS person
LEFT OUTER JOIN table AS child ON person.ID = child.parentID
WHERE child.parentID IS NULL

или в менее эффективной форме

select person.ID, person.name, count(child.id) AS number_of_children
FROM table AS person
LEFT JOIN table AS child on person.ID = child.parentID
GROUP BY person.id
HAVING number_of_children = 0