2013-02-26 105 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