|
|
2
John Cappelletti
6 年前
很明显,Gordon用递归CTE将其固定,但这里有另一个选项,使用
hierarchyid
data type.
示例
declare@yourtable table([id]int,[parent]int)
插入到@yourtable值中
(1,2)
,(2,空)
,(3,2)
,(4,3)
,(5,空)
;CTEP为(
选择ID
,父
,hierid=convert(hierarchyid,concat(“/”,id,“/”))
来自@yourtable
其中父级为空
全部合并
选择id=r.id
,父级=R.父级
,hierid=convert(hierarchyid,concat(p.hierid.toString(),r.id,/')
来自@yourtable r
加入r.parent=p.id上的ctep p
)
选择ID
,父
,[路径]=hierid.getDescendant(空,空)。ToString()
,parentCount=hierid.getLevel()-1
来自CTEP A
由A.Hierid订购
返回

Declare @YourTable Table ([ID] int,[parent] int)
Insert Into @YourTable Values
(1,2)
,(2,NULL)
,(3,2)
,(4,3)
,(5,NULL)
;with cteP as (
Select ID
,Parent
,HierID = convert(hierarchyid,concat('/',ID,'/'))
From @YourTable
Where Parent is Null
Union All
Select ID = r.ID
,Parent = r.Parent
,HierID = convert(hierarchyid,concat(p.HierID.ToString(),r.ID,'/'))
From @YourTable r
Join cteP p on r.Parent = p.ID
)
Select ID
,Parent
,[Path] = HierID.GetDescendant ( null , null ).ToString()
,ParentCount = HierID.GetLevel() - 1
From cteP A
Order By A.HierID
退换商品

|