TGViewer
Cross Join - канал о разработке Cross Join - канал о разработке @crossjoin · 3.83K subscribers
Post #57 923
Рекурсивные CTE в Postgresql

Рекурсивные CTE нужны для работы с хитросвязанными между собой строками, например, для работы с деревьями

К примеру, у вас есть записи ( id, parent_id, name ), и вам надо построить поддерево для определенного id.

Как это всё работает.

На самоме деле, название "рекурсивные CTE" не совсем удачное, больше подошло бы "итеративное CTE".

Пример:

WITH RECURSIVE r AS (
SELECT id, parent_id, name
FROM geo
WHERE parent_id = 4

UNION

SELECT geo.id, geo.parent_id, geo.name
FROM geo
JOIN r
ON geo.parent_id = r.id
)
SELECT * FROM r;

Рекурсивный подзапрос должен состоять из двух частей, объединенных UNION

Первая часть (та что до UNION) - это так называемый anchor, он выполняется в начале, это первая итерация.

Далее в цикле выполняется вторая часть. Это очередная итерация, которая работает в связке с предыдущей (джойнится на результат предыдущей итерации).

Это всё работает до тех пор, пока очередная итерация не вернёт 0 строк результата.

Т.е. получается, что мы в первом запросе нашли все элементы где parent_id = 4, потом нашли элементы, где parent_id - это id из первого запроса, и т.д., пока не кончится.

В случае, если в таблице граф с циклическими связями, то эти итерации не кончатся никогда )

Для того, чтобы бороться с этой проблемой в postgres 14 будут сделаны дополнительные ключевые слова. Но об этом позже )
More from @crossjoin
  1. Oct 2, 2026Теперь у нас у всех есть простой способ поддерживать знание иностранного языка. Просто раз…
  2. Oct 2, 2026Вышел NATS Server 2.15.0 Самое важное: • Надёжнее работа JetStream-кластера. Масштабирован…
  3. Sep 29, 2026😱 Отправили свое резюме на 129 вакансий на хх, а в ответ тишина .. Думаете, что дело в ры…
  4. Sep 28, 2026Слышал недавно в каком-то подкасте мысль, что Haskell плохо подходит для вайбкодинга прост…
  5. Sep 26, 2026Антон Жиянов написал мини-книгу по Go-concurrency. Это что-то вроде плотного конспекта с и…
  6. Sep 22, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →