Recursion 给定层次结构中的任何ID,在自引用表中获取整个ID链
我有一个包含以下数据的表:Recursion 给定层次结构中的任何ID,在自引用表中获取整个ID链,recursion,parent-child,hierarchy,sql-server-2008-r2,common-table-expression,Recursion,Parent Child,Hierarchy,Sql Server 2008 R2,Common Table Expression,我有一个包含以下数据的表: +----+----------+ | ID | ParentID | +----+----------+ | 27 | 0 | | 38 | 27 | | 45 | 38 | | 86 | 0 | | 92 | 45 | | 48 | 86 | | 62 | 92 | | 50 | 62 | ----------------- 我希望能够将任何ID传递给存储过程,
+----+----------+
| ID | ParentID |
+----+----------+
| 27 | 0 |
| 38 | 27 |
| 45 | 38 |
| 86 | 0 |
| 92 | 45 |
| 48 | 86 |
| 62 | 92 |
| 50 | 62 |
-----------------
我希望能够将任何ID传递给存储过程,并获取给定ID的整个ID链(父ID和子ID)
即,如果我通过ID=45,我应该得到:
27
38
45
92
62
50
86
48
同样,如果我通过ID=86,我应该得到:
27
38
45
92
62
50
86
48
任何帮助都将不胜感激 您可以使用两个递归CTE。第一个查找根节点,第二个构建链
declare @T table(ID int, ParentID int)
insert into @T values (27, 0), (38, 27), (45, 38), (86, 0),
(92, 45), (48, 86), (62, 92), (50, 62)
declare @ID int = 45
;with cte1 as
(
select T.ID, T.ParentID, 1 as lvl
from @T as T
where T.ID = @ID
union all
select T.ID, T.ParentID, C.lvl+1
from @T as T
inner join cte1 as C
on T.ID = C.ParentID
),
cte2 as
(
select T.ID, T.ParentID
from @T as T
where T.ID = (select top 1 ID
from cte1
order by lvl desc)
union all
select T.ID, T.ParentID
from @T as T
inner join cte2 as C
on T.ParentID = C.ID
)
select ID
from cte2
第2版
稍微短一点,查询计划建议更有效,但如果不在实际数据上进行测试,您永远不会知道这一点
;with cte as
(
select T.ID, T.ParentID, ','+cast(@ID as varchar(max)) as IDs
from @T as T
where T.ID = @ID
union all
select T.ID, T.ParentID, C.IDs+','+cast(T.ID as varchar(10))
from @T as T
inner join cte as C
on (T.ID = C.ParentID or
T.ParentID = C.ID) and
C.IDs+',' not like '%,'+cast(T.ID as varchar(10))+',%'
)
select ID
from cte
谢谢你的帮助,米克尔。您的第一个解决方案返回了所需的结果。