递归表SQL上的视图级别号
我有下表:递归表SQL上的视图级别号,sql,tsql,sql-server-2014,Sql,Tsql,Sql Server 2014,我有下表: -------------------------------------------- ID ParentID Item -------------------------------------------- 1 root 2 1 AA 3 1 BB 4 1 CC 5 1 DD 6
--------------------------------------------
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
上实现这一点您将使用递归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;
将此数据存储在表中是。麻烦,因为您需要不断更新它。当你需要它时,你可能想快速计算它。只需使用
densite\u 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
希望它能帮助您。尝试添加两行,(8,,'A12'),(9,'8','A12')。为什么会有人使用不同类型的id和parent?