获取层次结构中每一行的级别 table sql

Get level of each rows in a hierarchical table sql

我有一个table这样的

ID    Name     Parent
-----------------------
1     Test1    NULL
2     Test2    NULL
3     Test3     1
4     Test4     3
5     Test5     2
6     Test6     4
7     Test7     3
-------------------------

请帮助我获取每一行的级别编号。像这样

ID    Name     Parent   Level
------------------------------
1     Test1    NULL      0
2     Test2    NULL      0
3     Test3     1        1
4     Test4     3        2
5     Test5     2        1
6     Test6     4        3
7     Test7     3        2
--------------------------------

所以这就像绘制层次结构中的每个项目楼层级别。

我没有说明,我使用的是 MS SQL 2012

我们可以使用递归 CTE 轻松处理这个问题。在下面的 CTE 中,前半部分是基本条件,其中包括那些没有父级的顶级父级记录。递归部分,即联合的下半部分,以所有子记录为目标。我们通过将直接父项的值加一来记录级别。

WITH cte AS (
    SELECT ID, Name, Parent, 0 AS level
    FROM yourTable
    WHERE Parent IS NULL
    UNION ALL 
    SELECT t1.ID, t1.Name, t1.Parent, t2.level + 1
    FROM yourTable t1
    INNER JOIN cte t2
        ON t1.Parent = t2.ID
)

SELECT ID, Name, Parent, Level
FROM cte
ORDER BY ID;

Demo