2013-02-26 103 views
2

我有以下的自引用階層表:分層數據 - 遞歸CTE加PIVOT?

SubCodes 

ID int PK 
ParentID int 
Code varchar(25) 
FKID int 

例如

ID FKID  ParentID Code 
1  25  NULL  1100 
2  NULL  1   1110 
3  NULL  2   1111 

我想編寫一個查詢,這樣我回去

FKID Answer    IDOfLowestNode 
25  '1100,1110,1111'  3 

我懷疑我需要一個CTE和樞軸 - 但它只是扭我的大腦是如何做到這一點 - 任何線索?

回答

2

試試這個

declare @SubCodes table (ID int,ParentID int,Code varchar(25),FKID int) 

insert into @SubCodes (ID,FKID,ParentID,Code) 
values 
(1,  25,  NULL,  1100), 
(2,  NULL,  1,   1110), 
(3,  NULL,  2,   1111) 

;with cte as 
(
    select ID RootID,ID,ParentID,Code, CAST(Code as varchar(500)) answer 
    from @SubCodes 
    where ParentID is null 
    union all 
    select cte.RootID,sc.ID,sc.ParentID,sc.Code, CAST(cte.answer+','+sc.Code as varchar(500)) 
    from @SubCodes sc 
     join cte on cte.ID=sc.ParentID 
) 
select c.answer, r.id LowestNode 
from cte c 
    join (select RootID, MAX(id) id FROM cte GROUP BY RootID) r ON c.ID=r.id 
+0

輝煌!我將閱讀,學習和吸收 - 並希望下次有這樣的問題時,我可以讓自己的大腦圍繞遞歸CTE而彎曲。 – kpollock 2013-02-26 11:56:47

+0

@kpollock其實,它並不像你想象的那麼難。雖然,7年前我自己也很害怕:)所以,祝你好運。要理解遞歸,你需要了解遞歸:) – 2013-02-26 12:07:33

+0

:-)哦,遞歸我很好 - 只是不習慣用聲明來表達它,只是在程序上。 – kpollock 2013-02-26 12:12:44