2015-02-24 312 views
0

我有以下要求,层次结构在SQL Server - 多层次

输入

ID Parent_ID 
------------ 
1 0 
2 0 
3 10 
4 0 
5 3 
6 20 
7 3 
8 21 
9 3 
10 0 
20 0 
21 0 
  • 当我使用@ID = 1结果必须是1
  • 当我使用@ID = 6结果必须是20.
  • 当我使用@ID = 5或7,9时,结果必须是10,因为5 - > 3(Parent_ID - > Str_ID) - > 10(Parent_ID - > Str_I D) - > 0(在Parent_ID中停止为0),所以结果为10.

所以我的任务是查找ID,只要我在Parent_ID中找到0即可。

输出:

@ID Result 
---------- 
1 1 
2 2 
3 10 
4 4 
5 10 
6 20 
7 10 
8 21 
9 10 
10 10 
20 20 
21 21 

回答

1

递归CTE与汇总可以这样做:MSDN Article

BEGIN 
--Setup some data 
DECLARE @tmp as TABLE (ID int, ParentID int); 
INSERT INTO @tmp 
VALUES 
(1 , 0), 
(2 , 0), 
(3 , 10), 
(4 , 0), 
(5 , 3), 
(6 , 20), 
(7 , 3), 
(8 , 21), 
(9 , 3), 
(10, 0), 
(20, 0), 
(21, 0), 
(44, 5), 
(83, 44), 
(46, 83), 
(23, 7); 

WITH Parents (ID, ParentID, TopParent) AS (
    SELECT ID, ParentID, ID 
     FROM @tmp 
     WHERE ParentID = 0 
    UNION ALL 
    SELECT t.ID, t.ParentID, p.TopParent 
     FROM Parents p 
     JOIN @tmp t on t.ParentID = p.id) 
SELECT * FROM Parents 
--Or to get just the ID and top parent: SELECT ID, TopParent FROM Parents 

END 

结果:

ID   ParentID TopParent 
----------- ----------- ----------- 
1   0   1 
2   0   2 
4   0   4 
10   0   10 
20   0   20 
21   0   21 
8   21   21 
6   20   20 
3   10   10 
5   3   10 
7   3   10 
9   3   10 
23   7   10 
44   5   10 
83   44   10 
46   83   10