递归表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?