Бла-бла-бла.
DECLARE @Group TABLE (
ID Int IDENTUTY PRIMARY KEY
,Parent Int NULL -- REFERENCES @Group(ID)
,UNIQUE ( -- Index
Parent
,ID
)
);
INSERT @Group SELECT NULL
UNION ALL SELECT 1
UNION ALL SELECT 1
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 2
UNION ALL SELECT 4
UNION ALL SELECT 5;
--------------------------------------------------------
DECLARE @Parent Int;
SET @Parent = 2;
DECLARE @Result TABLE (
Level SmallInt
,ID Int
,PRIMARY KEY ( -- Index
Level
,ID
)
);
--------------------------------------------------------
DECLARE @Level SmallInt;
SET @Level = 0;
INSERT @Result (Level ID)
SELECT @Level,ID
FROM @Group
WHERE ID = @Parent;
WHILE (@@RowCount > 0) BEGIN
SET @Level = @Level + 1;
INSERT @Result (Level ID)
SELECT @Level,C.ID
FROM @Result P
JOIN @Group C ON C.Parent = P.ID
WHERE P.Level = @Level - 1;
END
SELECT G.*
FROM @Result R
JOIN @Group G ON G.ID = R.ID