|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Здравствуйте. слегка запутался в рекурсии есть запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
выводит все дерево и соответствующие суммы по ветвям. все хорошо. Но как показать например данные определенного уровня. если поставить такое условие - where k.parent = 66023 то он все равно раскручивает дерево и вверх и вниз. есть вариант запроса с execute block и временной таблицей. но условие накладывается после рекурсии. те чтобы мне получить данные определенного уровня ( 5-15 строк) вычитывается все дерево. спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2015, 23:10 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
sergq, есть подозрение, что вместо "where k.parent = 66023" надо в root-части ставить "where k.id = 66023". Но будет лучше, если вы предоставите DDL таблиц и пример данных - здесь мало энтузиастов, готовых выдумывать эту инфу за вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 17:06 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Таблоид, если раскомментировать where k.parent = 66023 в root части, то если у строки есть дети - не считает сумму по этой строке. данные приложил. еще раз запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
для строки с ID = 66045 не считается сумма. и дерево разворачивается вне зависимости от условия в root ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 17:52 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
sergqданные приложил.Повторите попытку, плз, их нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 17:54 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
пардон. файл с данными тут http://wdfiles.ru/57z ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 17:55 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
sergq для строки с ID = 66045 не считается сумма. и дерево разворачивается вне зависимости от условия в root конечно не считается. Ты же её для потомков считаешь. А не для самой этой строки ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 19:10 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Симонов Денис, тогда вообще не понимаю ) выполнил запрос без фильтра в root. в результате получил две строки с ID = 66045. одна с суммой ноль. другая с нулевой суммой. если вернуть условие в root - сумма нулевая ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 19:23 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Эти крохотные данные можно было и сюда затолкать: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Если этот запрос надо вкрячить в параметризованную ХП, то во where-условии у вас должен быть входной параметр ("уровень" или что-то там еще). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2015, 22:49 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Таблоид, вот как только условие parent = 66023 добавляю - исчезает строка с SUM_COUNT = 10000 делал на примере http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=713220&msg=7954817 там все правильно считает. но там предварительно во временную таблицу добавляется вообще все дерево. фильтрация по нужному паренту тоже только в FOR SELECT. и общее время выполнения запроса в районе 900-1000 милисекунд. много. В дереве всего 10000 нод ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2015, 00:33 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
sergqвот как только условие parent = 66023 добавляю - исчезает строка с SUM_COUNT = 10000Меня терзают смутные сомнения, что на самом деле вам надо получить для заданного ID сумму по всем записям, для которых этот ID является прямым или опосредованным предком. С группировкой по полю isGroup. Если это так, то формируйте на каждой итерации рекурсии наращиваемую строку, являющуюся путём к текущему узлу от самого верха. Далее (после рекурсии) добавляйте where-условие со своем "66023" и затем - группировку с суммой. Т.е. примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2015, 01:47 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Таблоид, если быть точным, то на этих данных CREATE TABLE TEST_TREE_Z ( ID INTEGER, PARENT INTEGER, COUNTER INTEGER, NAME CHAR(1000), CODE CHAR(1000), ISGROUP INTEGER ); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (65921, 229148, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (65926, 65921, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (65927, 65926, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (65928, 65927, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (65929, 65928, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66023, 65929, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66024, 66023, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66027, 66023, 388, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66028, 66023, 398, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66029, 66023, 198, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66030, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66031, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66032, 66023, 545, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66033, 66023, 6, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66034, 66023, 6, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66035, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66036, 66023, 12, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66037, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66038, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66039, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66040, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66041, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66042, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66043, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66044, 66023, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66045, 66023, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66052, 66023, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66056, 66023, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (229148, 0, 0, 1); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66046, 66045, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66047, 66045, 10000, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66048, 66045, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66049, 66045, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66050, 66045, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66051, 66045, 0, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66025, 66024, 373, 0); INSERT INTO TEST_TREE_Z (ID, PARENT, COUNTER, ISGROUP) VALUES (66026, 66024, 140, 0); COMMIT WORK; надо получить такой результат idisgroupcounter6602415136602703886602803986602901986603000660310066032054566033066603406660350066036012660370066038006603900660400066041006604200660430066044006604511000066052106605610 те все ноды указанного уровня. вне зависимости от значения counter. Если нода является группой - посчитать сумму ее детей ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2015, 10:38 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Таблоид, в последнем запросе ид 66026,66025,66045 идут отдельно а должно быть 66024 = 66026+66025 66045 = 66047 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2015, 11:18 |
|
CTE рекурсия
|
|||
---|---|---|---|
#18+
Таблоид, вроде как получилось ) сначала с дерева взял нужный уровень. а потом отдельной рекурсией выбрал всю иерархию от уровня Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2015, 12:15 |
|
|
start [/forum/topic.php?fid=40&msg=38999940&tid=1562736]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 276ms |
total: | 408ms |
0 / 0 |