|
|
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
Дамы и господа, очень Вас прошу помочь затупившему коллеге! Имеется следующая таблица, в которой перечислены узлы и детали из которых эти узлы состоят (узел может состоять как из деталей, так и из других узлов). Для каждой детали указан вес: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. idparentnameweight1NULLNODE_102NULLNODE_2031NODE_1_1041NODE_1_205NULLNODE_3063ITEM_1_1_1574ITEM_1_2_1383ITEM_1_1_2693ITEM_1_1_31104ITEM_1_2_22115ITEM_3_17124ITEM_1_33135NODE_3_201413ITEM_3_2_181513ITEM_3_2_29 Я создал CTE, которое вывело дерево узлов и деталей: Код: sql 1. 2. 3. 4. 5. 6. 7. Код: plaintext Код: plaintext Но, это всем давно известно и никому не интересно. А интересно следующее: как для каждого узла вычислить его вес, который суммируется из веса деталей и подузлов входящих в этот узел? == А баги ползали и нагло шевелили усами... (с) Не моё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 08:14 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
Я бы просто строил CTE не от корней, а от листьев... тогда можно тащить и накапливать вес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 08:18 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
Akina, идея хорошая, спасибо за неё, но требуется решить один вопрос: Если выборка нужна для одного узла, то как определить, какие детали в него входят (включая подузлы). А делать общую выборку по таблице в которой миллиард и ещё одна запись, довольно накладно. Или я не прав? Делать два CTE, где первый определяет состав узла, а второй суммирует веса? Громоздко. Писать рекусивную хранимку, которая считает всё, что нужно? Громоздко и накладно... Неужели CTE не умеют суммировать листья? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 09:28 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
Harlan, Это ? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. idparentlvlhidnamesum_wgt1NULL0/1/NODE_1202NULL0/2/NODE_20311/1/3/NODE_1_112411/1/4/NODE_1_285NULL0/5/NODE_324632/1/3/6/ITEM_1_1_15742/1/4/7/ITEM_1_2_13832/1/3/8/ITEM_1_1_26932/1/3/9/ITEM_1_1_311042/1/4/10/ITEM_1_2_221151/5/11/ITEM_3_171242/1/4/12/ITEM_1_331351/5/13/NODE_3_21714132/5/13/14/ITEM_3_2_1815132/5/13/15/ITEM_3_2_29 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 09:35 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
HarlanЕсли выборка нужна для одного узла, то как определить, какие детали в него входят (включая подузлы).В первом CTE подберите все листья этого узла. Во втором от этих листьев вернитесь к узлу, считая вес. Какие сложности-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 09:36 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
Альтернативно - получив все подузлы нужного узла, суммировать их вес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 09:37 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
AkinaВ первом CTE подберите все листья этого узла. Во втором от этих листьев вернитесь к узлу, считая вес. Какие сложности-то? Никаких, за исключением того, что не хотелось бы делать "лишнюю работу". Можно, конечно, соорудить хранимую процедуру, которая всё это посчитает, но зачем, если есть возможность CTE сделать нужные подсчёты? А есть они или нет - вот, собственно, в чём вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 09:46 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
courtЭто ? Да. Очень похоже на то. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 09:48 |
|
||
|
Суммирование данных в рекурсивном выражении. Возможно ли?
|
|||
|---|---|---|---|
|
#18+
court, Немного подправлю ваш запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Т.е. вместо приведения поля hid к строке и использования LIKE взял метод s2.hid.IsDescendantOf(s1.hid), который возвращает 1, если s1.hid является родителем s2.hid. Ну и добавил order by s1.hid для сохранения структуры дерева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2019, 10:56 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39877437&tid=1687110]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
180ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 529ms |

| 0 / 0 |
