Выборка из БД всех потомков древовидной сущности

В СУБД 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
→ Ссылка