Выборка из БД всех потомков древовидной сущности
В СУБД PostgreSQL имеется БД, содержащая таблицу древовидной сущности. Т.е. в записях этой таблицы есть ссылки на другие записи этой таблицы. Визуально эта сущность отображается в виде дерева.
root
item1
item11
item111
item2
item21
item211
item212
item2121
item22
Уровней вложенности может быть достаточно много. Вопрос: как с помощью SQL запроса выбрать всех потомков конкретной записи? Т.е. для заданного элемента, например, item2 SQL запрос должен возвращать: item21, item211, item212, item2121, item22.
Ответы (1 шт):
Автор решения: Ainar-G
→ Ссылка
Собственно, ваша задача — классический случай для использования рекурсивных общих табличных выражений:
name | parent ------+-------- 1 | NULL 2 | NULL 11 | 1 22 | 2 111 | 11 222 | 22
WITH RECURSIVE t_2 AS (
SELECT * FROM t_1 WHERE name = '1'
UNION ALL
SELECT t_1.*
FROM t_1
JOIN t_2 ON t_1.parent = t_2.name
)
SELECT *
FROM t_2
;
name | parent ------+-------- 1 | NULL 11 | 1 111 | 11