Для того, чтобы найти все дочерние записи, нужно использовать рекурсивный запрос:
WITH RECURSIVE t(root_parent, id, parent, name) AS (
SELECT id as root_parent, id, parent, name FROM your_table WHERE parent IS NULL
UNION ALL
SELECT t.root_parent, your_table.id, your_table.parent, your_table.name FROM your_table, t WHERE your_table.parent = t.id
)
SELECT t.root_parent as id, your_table.name, array_agg(t.name) as children
FROM t
JOIN your_table ON your_table.id = t.root_parent
WHERE t.parent IS NOT NULL
GROUP BY t.root_parent, your_table.name
ORDER BY t.root_parent
Демо: http://rextester.com/AEA93879
Вы можете прочитать о рекурсивном запросы в PostgreSQL documentaion
выше запросы могут показаться слишком запутанными первым, позвольте мне объясните это немного. Он состоит из двух частей: самого рекурсивного запроса и select-query. Вот вывод рекурсивного запроса:
WITH RECURSIVE t(root_parent, id, parent, name) AS (
SELECT id as root_parent, id, parent, name FROM your_table WHERE parent IS NULL
UNION ALL
SELECT t.root_parent, your_table.id, your_table.parent, your_table.name FROM your_table, t WHERE your_table.parent = t.id
)
SELECT * FROM t
-----------------------------------
| root_parent | id | parent | name |
|1 |1 | |"A" |
|4 |4 | |"D" |
|1 |2 |1 |"B" |
|1 |3 |1 |"C" |
|4 |5 |4 |"E" |
|4 |6 |5 |"F" |
------------------------------------
И вторая часть запроса просто выполняет группировку, так что список детей показан для каждой корневой записи.
«Все ли дети» представляют все _descendants_ на любой глубине? Если нет, то почему 'F' указан как ребенок' D'? –
Да, мне нужны все потомки – YSherf