Sql server 分层数据-递归CTE plus PIVOT?

Sql server 分层数据-递归CTE plus PIVOT?,sql-server,hierarchy,common-table-expression,Sql Server,Hierarchy,Common Table Expression,我有以下自参考分层表: SubCodes ID int PK ParentID int Code varchar(25) FKID int e、 g 我想写一个查询,这样我就可以回来了 FKID Answer IDOfLowestNode 25 '1100,1110,1111' 3 我想我需要一个CTE和一个支点,但这只是扭曲了我的大脑,想知道怎么做,有什么线索吗?试试这个 declare @SubCodes table (ID i

我有以下自参考分层表:

SubCodes

ID int PK
ParentID int
Code varchar(25)
FKID int 
e、 g

我想写一个查询,这样我就可以回来了

FKID    Answer                IDOfLowestNode
25      '1100,1110,1111'      3
我想我需要一个CTE和一个支点,但这只是扭曲了我的大脑,想知道怎么做,有什么线索吗?

试试这个

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

明亮的我将阅读、学习和吸收——并希望下一次我有这样的疑问时,我能自己绞尽脑汁思考递归CTE。@kpollock事实上,这并不像你想象的那么难。虽然,7年前我自己也很害怕:)所以,祝你好运。要理解递归,你需要理解递归:):-)哦,递归我很好-只是不习惯用声明的方式来表达它,只是程序化的。
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