Есть таблицы с полями 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
Но работает все довольно медленно. Как ускорить?