查看递归表SQL上的级别编号

时间:2018-03-28 07:39:34

标签: sql tsql sql-server-2014

我有下表:

--------------------------------------------
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.
  1. 创建新列level的最佳方法是什么?是创建一个新列并添加一个公式或类似计算或可能的函数?
  2. 如何在t-sql上实现这一目标?
  3. 谢谢。

2 个答案:

答案 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

希望它对你有所帮助。