Рекурсивные запросы в PostgreSQL.

Сегодня прочел одноименную статью на хабре на практике рекурсивные запросы оказались довольно просты.

Нужно помнить всего лишь

  • про синтаксис (прописывается через использование WITH c ключевым словом recursive).
  • внутри with состоит из двух подзапросов, объединенных через union.

Подзапрос 1. Это базовая или стартовая информация Подзапрос 2. Это рекурсивные данные.

Алгоритм получается примерно следующий:

  1. Вычисляем стартовую информацию.
  2. Выносим ее в рекурсивную таблицу.
  3. Используя рекурсивную таблицу, вычисляем второй подзапрос.
  4. Во втором подзапросе появились новые (отсутствовавшие) данные? a. Да. Выносим данные в рекурсивную таблицу, переходим к пункту 3. b. Нет. Выходим из рекурсии.

пример запроса

with recursive recr_table as (
    -- базовая часть
    select base_data_part.*
    from original_table_name as base_data_part
    union
    -- рекурсивная часть
    select recr_data_part.*
    from original_table_name recr_data_part
             join recr_table
                  on recr_table.parent_column = recr_data_part.children_column)
select *
from recr_table;