Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Как избежать циклов в рекурсивных запросах  [new]
Alexey Agafonov
Member

Откуда: Москва
Сообщений: 691
Всем привет.

Вопрос по CTE - рекурсивным. Если в БД присутствуют записи, приводящие к бесконечному циклу, как их избежать? В Oracle есть оператор nocycle (может, и костыль некий, но работает прекрасно), в Postgres есть что-то подобное?

В интернетах предлагают ограничиться уровнем вложенности типа deph < 10, но это не интересно. Есть что-то более правильное, когда мы охватим все записи, но при этом, если встретим повторную запись, то не пойдем в цикл повторно? По сути, аналог nocycle в Oracle.

Заранее спасибо.
20 фев 21, 13:15    [22284041]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать циклов в рекурсивных запросах  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4571
Alexey Agafonov
Всем привет.

Вопрос по CTE - рекурсивным. Если в БД присутствуют записи, приводящие к бесконечному циклу, как их избежать? В Oracle есть оператор nocycle (может, и костыль некий, но работает прекрасно), в Postgres есть что-то подобное?

В интернетах предлагают ограничиться уровнем вложенности типа deph < 10, но это не интересно. Есть что-то более правильное, когда мы охватим все записи, но при этом, если встретим повторную запись, то не пойдем в цикл повторно? По сути, аналог nocycle в Oracle.

Заранее спасибо.


Нет такого нет.
Можно скостылить в виде массива накопителя уже увиденных данных если очень надо (но если у вас там десятки тысяч записей будут и больше обрабатываться это запретительно по памяти и скорости будет).


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
20 фев 21, 13:31    [22284047]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать циклов в рекурсивных запросах  [new]
Misha111
Member

Откуда:
Сообщений: 34
Alexey Agafonov,

собирать значения в массив или строку и по ним фильтровать
20 фев 21, 15:28    [22284117]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать циклов в рекурсивных запросах  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 887
Alexey Agafonov,

Можно самому считать глубину рекурсии в запросе и ограничиваться по ней

WITH RECURSIVE t(n) AS (
    SELECT 1
  UNION ALL
    SELECT n+1 FROM t WHERE n < 10
)
SELECT n FROM t;


Альтернативное решение, как сказали выше, накопление в массиве хешей уже обработанных строк. Но это сильно медленней.

Сообщение было отредактировано: 21 фев 21, 11:53
21 фев 21, 11:58    [22284366]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить