2015-02-24 2 views
0

я следующее требование,иерархии в SQL Server - несколько уровней

Input

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 (остановка 0 в PARENT_ID), так что результат 10.

Так что моя задача ищет ID, пока я найду 0 в Parent_ID.

Выход:

@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