|
with recursion
|
|||
---|---|---|---|
#18+
Здравствуйте! Есть рекурсивный запрос такого плана: Код: PL/pgSQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Не нравится такой момент - для idChild мы всегда находим все уровни до конца и уже потом ищем подходящего родителя по нужным нам условиям. Можно ли как-то переписать запрос так, чтобы он останавливался и не разматывал дерево дальше, если найдет нужного родителя? С помощью цикла while я такое поведение описала так: Создаю временную таблицу tmp и задаю переменную v_inLevel = 1. Код: PL/pgSQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2024, 11:44 |
|
with recursion
|
|||
---|---|---|---|
#18+
Nicolle [игнорируется] почему нерабочий запрос? что такое "l"? Зачем union и distinct? Код: SQL 1. 2. 3.
https://onecompiler.com/postgresql/42vxnwxp5 Код: SQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Данные нужно предоставлять как в примере выше, если чего-то не хватает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2024, 13:15 |
|
with recursion
|
|||
---|---|---|---|
#18+
Извиняюсь, поправила код, distinct можно убрать: Код: PL/pgSQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: PL/pgSQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2024, 08:09 |
|
with recursion
|
|||
---|---|---|---|
#18+
Nicolle [игнорируется] Код 1.
Здесь нужно проверять условие на первой итерации для этого случая. Код: SQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2024, 12:31 |
|
with recursion
|
|||
---|---|---|---|
#18+
Nicolle [игнорируется]
Но при этом получается, что рекурсия все равно строит полностью все дерево вверх. Код: SQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
Если убрать where done is null, то возвращает 7 строк. Есть есть всегда как максимум один родитель, то рекурсия не пойдёт далее первой строки, удовлетворяющей условиям. В случае нескольких родителей это уже не так, и, как мне известно, в PostgreSQL нет branch pruning (возможность просмотра других веток в рамках recursive CTE). Также я бы не сказал, что ситуация наличия более одного родителя является типичной. Если задача найти не более одного родителя, удовлетворяющего условиям, я бы использовал следующее: Код: SQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
1 строка удалена по фильтру done is not null, recursive CTE был из 2х строк: Код: SQL 1. 2. 3. 4. 5. 6.
Если, например, убрать fetch first 1 row only: Код: SQL 1. 2. 3. 4. 5. 6.
Таким образом, для breadth first поиска не более одного родителя, можно использовать код, что выше. Лучше также явно добавить search breadth first ... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2024, 13:41 |
|
|
start [/forum/topic.php?fid=53&tid=2187056]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 289ms |
total: | 399ms |
0 / 0 |