Рекурсивные запросы в 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;

Дата изменения: