Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
Все привет Есть "хитрое" дерево, есть запрос (см ниже), хотелось бы выбрать всех потомков с уровнями, DB2 9.7 FP4 все как-бы хорошо (в большенстве случаев), но есть возможность (идеи?) убрать дупликаты в рекурсии (они там кстати с чего появились - непонятно)? Спасибо --- Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2011, 18:40 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
DB2 Рекурсия, Здравствуйте. Это потому, что В 14 из 11 вы приходите 2-мя путями: 11->12->14->15... 11->10->14->15... Здесь 14->15 в обоих случаях одного уровня (2), поэтому убрать не сложно (select distinct в последнем). Но что вам надо будет делать, если было бы: 11->12->14->15... 11->10->NNN->14->15... ? тогда у вас будет 14, 15, 2 14, 15, 3 и то жк самое дубли после 15 с разными уровнями... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2011, 19:04 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Mark BarinsteinЭто потому, что В 14 из 11 вы приходите 2-мя путями: 11->12->14->15... 11->10->14->15... верно! можно как-то агрегировать данные в-процессе по уровням (какая-то гибридная рекурсия получается- но все-таки)? Mark BarinsteinЗдесь 14->15 в обоих случаях одного уровня (2), поэтому убрать не сложно (select distinct в последнем). этот вариант не проходит, результат рекурсии огромен и скорость выполнения запроса низкая из-за выше. "феномена" нужно все сделать "до" Mark Barinsteinтогда у вас будет 14, 15, 2 14, 15, 3 и то жк самое дубли после 15 с разными уровнями... здесь не так важно, уровни разные и проще обработать (если потребуется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2011, 20:03 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
DB2 Рекурсия, пока вы не опишете нужный алгоритм, помочь вам будет невозможно. Ещё раз. Какой результат вам надо получить на таких данных: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Другими словами: что вы будете делать, если на очередной итерации вы вдруг выяснили, что new_id=14 уже добавлялась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2011, 20:48 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
упс, забыл ещё в мои тестовые данные данные добавить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2011, 21:02 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, нужно чтоб результатом выполнения рекурсии не было дупликатов в вашем примере, дерево выглядит Код: plaintext 1. 2. 3. 4. результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. в идеале хотелось бы получить сразу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. или Код: plaintext 1. 2. 3. 4. 5. 6. 7. другими словами: в 14->15->16 можно прийти из 99 или 12, нужен один и только один любой из них ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 03:49 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
DB2 Рекурсия, Нужно написать свою небольшую UDF (скажем, на java), которая будет запоминать переданные в неё значения. Вот, например, есть у меня функция, которая работает так: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. С её использованием нужный вам результат будет получен таким запросом: Запрос с UDF Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Если кому интересно, могу выложить исходник с инструкцией создания... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 11:53 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinНужно написать свою небольшую UDF (скажем, на java), которая будет запоминать переданные в неё значения. можно такое сделать на SQL UDF? Mark BarinsteinМожно было бы и без неё обойтись, но rownumber() не работает в рекурсивных запросах. Оракловский диалект может в данном случае чем-то помочь? Mark BarinsteinЕсли кому интересно, могу выложить исходник с инструкцией создания было бы интересно, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 12:58 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
DB2 Рекурсияможно такое сделать на SQL UDF?Нет. Здесь надо сохранять результаты предыдущих вызовов. DB2 РекурсияОракловский диалект может в данном случае чем-то помочь?Может быть, но я не специалист в оракловом диалекте... Counter_grp.java Код: plaintext 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. из-под владельца инстанса из командной строки (если windows, то db2cw) компилируем: javac Counter_grp.java и кладём *.class в sqllib/function Counter_grp_j.sql Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Исправленный запрос для вашего примера Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 13:58 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Спасибо, буду пробывать (и также сравню с версией: простые SQL запросы + java рекурсия ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 16:19 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
Заключительный select в рекурсии: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2011, 15:13 |
|
||
|
Рекурсия + "хитрое" дерево
|
|||
|---|---|---|---|
|
#18+
golsaЗаключительный select в рекурсии: Код: plaintext имеется ввиду после рекурсии? когда дерево "сложное" то можно ждать 20-30 минут пока дело дойдет "до заключительного селекта", при этом результат будет каких-то пару сотен узлов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2011, 16:06 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=37422728&tid=1602127]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 288ms |
| total: | 556ms |

| 0 / 0 |
