|
задачка
|
|||
---|---|---|---|
#18+
Есть две таблицы: tbl1 (acc_id varchar(32) CONSTRAINT PK_ACC PRIMARY KEY, .... ) и tbl2 (row_id int, acc_id varchar(32) CONSTRAINT FK_ACC FOREIGN KEY REFERENCES tbl1(acc_id), sum numeric) Особенность поля tbl1.acc_id в том, что оно частично заполнено по B-TREE принципу: 1 1.1 1.1.1 1.1.2 1.2 1.3 1.3.1 1.4 2 2.1 2.2 2.2.1 2.2.2 2.3 3 .... и т.д. а в поле tbl2.acc_id заносятся только "листья" этого дерева (т.е. например значения 2.2 там нет). В поле tbl2.sum - некое число. Так вот, нужно вывести таблицу со всеми значениями tbl1.acc_id и соответствующими значениями tbl2.sum ГДЕ ЗНАЧЕНИЕ SUM ДЛЯ НЕУКАЗАННЫХ ACC_ID В ТАБЛИЦЕ TBL2, РАВНЯЛАСЬ БЫ СУММЕ ЕЕ ПОДМНОЖЕСТВА. Например: sum(1.1)=sum(1.1.1)+sum(1.1.2)+sum(1.1.3), а sum(1)=sum(1.1)+sum(1.2)+sum(1.3)+sum(1.4) Все это МОЖНО сделать через курсоры, что я и проделывал. Но если количество acc_id велико, то тут теряем в производительности. Может ли кто подсказать решение без курсоров? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2001, 13:00 |
|
задачка
|
|||
---|---|---|---|
#18+
CREATE PROCEDURE expand (@categoryID smallint) as -- где categoryID указывает с какой ветки или сразу с корня разворачивать дерево SET NOCOUNT ON DECLARE @level int, @line char(20), @razd varchar(40) CREATE TABLE #stack (categoryID smallint, _level int) CREATE TABLE #catalog (categoryID smallint, title varchar(40), _level int) INSERT INTO #stack VALUES (@categoryID, 1) SELECT @level = 1 WHILE @level > 0 BEGIN IF EXISTS (SELECT * FROM #stack WHERE _level = @level) BEGIN SELECT @categoryID = categoryID FROM #stack WHERE _level = @level SELECT @razd = title FROM categories WHERE categoryID = @categoryID IF (@level !=1) INSERT #catalog (categoryID, title, _level) VALUES (@categoryID, @razd, @level) DELETE FROM #stack WHERE _level = @level AND categoryID = @categoryID INSERT #stack SELECT categoryID, @level + 1 FROM categories WHERE parentID = @categoryID AND parentID IS NOT NULL ORDER BY title DESC IF @@ROWCOUNT > 0 SELECT @level = @level + 1 END ELSE SELECT @level = @level - 1 END -- WHILE DROP TABLE #stack SELECT categoryID, title, _level FROM #catalog DROP TABLE #catalog ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2001, 15:30 |
|
|
start [/forum/topic.php?fid=46&msg=32003752&tid=1827095]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 376ms |
0 / 0 |