获取层次表sql中每一行的级别

时间:2019-02-19 10:36:57

标签: sql sql-server-2012 hierarchical-data

我有一张这样的桌子

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

1 个答案:

答案 0 :(得分:2)

我们可以使用递归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;

enter image description here

Demo