我有下表:
--------------------------------------------
ID ParentID Item
--------------------------------------------
1 root
2 1 AA
3 1 BB
4 1 CC
5 1 DD
6 2 A1
7 6 A11
ff.
我希望得到以下结果:
ID ParentID Item Level
---------------------------------------------
1 root 0
2 1 AA 1
3 1 BB 1
4 1 CC 1
5 1 DD 1
6 2 A1 2
7 6 A11 3
ff.
level
的最佳方法是什么?是创建一个新列并添加一个公式或类似计算或可能的函数?t-sql
上实现这一目标?谢谢。
答案 0 :(得分:6)
您将使用递归CTE:
with cte as (
select t.id, t.parentid, t.item, 0 as lvl
from t
where parentid is null
union all
select t.id, t.parentid, t.item, cte.lvl + 1 as lvl
from t join
cte
on t.parentid = cte.id
)
select *
from cte;
将这些数据存储在表中是。 。 。麻烦,因为你需要保持更新。您可能希望在需要时即时计算它。
答案 1 :(得分:0)
只需使用DENSE_RANK
:
DECLARE @YourTable TABLE(ID INT,ParentID VARCHAR(10),Item VARCHAR(10))
INSERT into @YourTable VALUES(1,' ','root')
INSERT into @YourTable VALUES(2,'1','AA')
INSERT into @YourTable VALUES(3,'1','BB')
INSERT into @YourTable VALUES(4,'1','CC')
INSERT into @YourTable VALUES(5,'1','DD')
INSERT into @YourTable VALUES(6,'2','A1')
INSERT into @YourTable VALUES(7,'6','A11')
SELECT ID,ParentID,Item
,(DENSE_RANK() OVER(ORDER BY ISNULL(NULLIF(ParentID,''),0)))-1 [Level]
FROM @YourTable
<强>输出:强>
ID ParentID Item Level
1 root 0
2 1 AA 1
3 1 BB 1
4 1 CC 1
5 1 DD 1
6 2 A1 2
7 6 A11 3
希望它对你有所帮助。