Подсчет детей в дереве
От: DePress Россия  
Дата: 13.02.03 14:04
Оценка:
Есть таблицы с полями NODE(ID_NODE, ID_PARENT, TYPE). Среди всех моих типов есть тип "Каталог"(номер, скажем, 1).

Нужно написать хранимую процедуру, которая бы возвращала количество ВСЕХ детей(внук, правнук и т.д.) в каталоге. Причем внутренние узлы-каталоги не должны считаться, но если у них есть дети-НЕкаталоги, то дети считались. Сейчас реализовано так:


CREATE PROCEDURE dbo.DocChildrenCount @id_node int
AS
BEGIN
    DECLARE @res int
    DECLARE @lev int
    CREATE TABLE #ChildNodeList
    (
        ID_NODE int PRIMARY KEY,
        LEV int NOT NULL
    )
    SELECT @lev = 0
    INSERT INTO #ChildNodeList (ID_NODE, LEV)
    SELECT ID_NODE, @lev FROM NODE
        WHERE ID_NODE = @id_node
    WHILE (@@ROWCOUNT > 0)
    BEGIN
        SELECT @lev = @lev + 1
        INSERT INTO #ChildNodeList (ID_NODE, LEV)
        SELECT DISTINCT N.ID_NODE, @lev FROM NODE N
            WHERE N.ID_PARENT IN (SELECT ID_NODE FROM #ChildNodeList) AND
            N.ID_NODE NOT IN (SELECT ID_NODE FROM #ChildNodeList)
    END

    SELECT @res=count(*)
    FROM #ChildNodeList C, NODE N 
    WHERE C.ID_NODE = N.ID_NODE
        AND N.ID_ITEMTYPE <>1

RETURN @res
END

Но работает все довольно медленно. Как ускорить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.