Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / PostgreSQL |
![]() ![]() |
Alexey Agafonov Member Откуда: Москва Сообщений: 691 |
Всем привет. Вопрос по CTE - рекурсивным. Если в БД присутствуют записи, приводящие к бесконечному циклу, как их избежать? В Oracle есть оператор nocycle (может, и костыль некий, но работает прекрасно), в Postgres есть что-то подобное? В интернетах предлагают ограничиться уровнем вложенности типа deph < 10, но это не интересно. Есть что-то более правильное, когда мы охватим все записи, но при этом, если встретим повторную запись, то не пойдем в цикл повторно? По сути, аналог nocycle в Oracle. Заранее спасибо. |
20 фев 21, 13:15 [22284041] Ответить | Цитировать Сообщить модератору |
Maxim Boguk Member Откуда: Melbourne, Австралия Сообщений: 4571 |
Нет такого нет. Можно скостылить в виде массива накопителя уже увиденных данных если очень надо (но если у вас там десятки тысяч записей будут и больше обрабатываться это запретительно по памяти и скорости будет). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru |
||||
20 фев 21, 13:31 [22284047] Ответить | Цитировать Сообщить модератору |
Misha111 Member Откуда: Сообщений: 34 |
Alexey Agafonov, собирать значения в массив или строку и по ним фильтровать |
20 фев 21, 15:28 [22284117] Ответить | Цитировать Сообщить модератору |
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 | ![]() |