Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / задачка / 2 сообщений из 2, страница 1 из 1
30.03.2001, 13:00
    #32003752
Rollback
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка
Есть две таблицы: 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 велико, то тут теряем в производительности.

Может ли кто подсказать решение без курсоров?
...
Рейтинг: 0 / 0
30.03.2001, 15:30
    #32003759
Jocy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка
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
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / задачка / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]