Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Задачка с деревом
|
|||
|---|---|---|---|
|
#18+
Помогите с решить задачку с деревом. Есть такая таблица: ID ParentID SumByID SumParent 1 NULL 111 0 2 1 2 0 3 1 32 0 4 NULL 0 0 5 4 27 0 6 5 5 0 7 6 0 0 Необходимо заполнить поле SumParent суммой всех SumByID данной ветки. Например: для ID=1 SumParent=111+2+32 для ID=2 SumParent=2 для ID=4 SumParent=0+27+5+0 для ID=6 SumParent=5+0 и т.д. Я посмотрел темы в форуме, но там в основном задачи на построение дерева от корня и далее. А здесь скорее наоборот нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 08:09 |
|
||
|
Задачка с деревом
|
|||
|---|---|---|---|
|
#18+
Я сделал так: create table qqq ( ID int identity primary key, ParentID int null foreign key references qqq, SumByID int not null, SumParent int not null ) go set identity_insert qqq on insert into qqq (ID, ParentID, SumByID, SumParent) values (1, NULL, 111, 0) insert into qqq (ID, ParentID, SumByID, SumParent) values (2, 1, 2, 0) insert into qqq (ID, ParentID, SumByID, SumParent) values (3, 1, 32, 0) insert into qqq (ID, ParentID, SumByID, SumParent) values (4, NULL, 0, 0) insert into qqq (ID, ParentID, SumByID, SumParent) values (5, 4, 27, 0) insert into qqq (ID, ParentID, SumByID, SumParent) values (6, 5, 5, 0) insert into qqq (ID, ParentID, SumByID, SumParent) values (7, 6, 0, 0) set identity_insert qqq off go create function sum_qqq_parent (@qqq_id int) returns int as begin declare @result int select @result = SumById from qqq where id = @qqq_id select @result = @result + IsNull(sum(dbo.sum_qqq_parent(id)), 0) from qqq where ParentId = @qqq_id return @result end go update qqq set SumParent = dbo.sum_qqq_parent(id) Недостаток в том, что каждый узел считается вглубь столько раз, сколько в нем уровней, потому что в функции нельзя делать update. Можно попробовать сделать процедуру, но в ней, видимо, придется использовать курсор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 09:05 |
|
||
|
Задачка с деревом
|
|||
|---|---|---|---|
|
#18+
Код "сырой" и не очень проверенный, но идею думаю поймешь -- Отбираю во временную таблицу все записи у которых нет ни одного ПОТОМКА -- т.е. ни одна запись не ссылается на них как на родителя SELECT * INTO #TabTmp FROM TabTree WHERE ID NOT IN (SELECT ParentID FROM TabTree) -- Организую цикл пока есть хотя бы одна запись в таблице #TabTmp -- Наверно можно поставить условие @@RowCount>0 - не проверял WHILE EXISTS (SELECT * FROM #TabTmp) BEGIN -- Запись очередных сумм UPDATE TabTree SET a.SumParent=a.SumParent+b.SumByID FROM TabTree a, #TabTmp b WHERE a.ID=b.ID -- Теперь необходимо пересоздать таблицу #TabTmp так, чтобы в ней оказались те записи -- прямые потомки которых сейчас находятся в #TabTmp SELECT * INTO #TabTmp2 FROM TabTree WHERE ID IN (SELECT ParentID FROM #TabTmp WHERE NOT ParentID IS NULL) DROP TABLE #TabTmp SELECT * INTO #TabTmp FROM #TabTmp2 DROP TABLE #TabTmp2 END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 13:35 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3483&tid=1823041]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 359ms |

| 0 / 0 |
