首页 > 解决方案 > 获取分层表sql中每一行的级别

问题描述

我有一张这样的桌子

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

标签: sqlsql-server-2012hierarchical-data

解决方案


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

在此处输入图像描述

演示


推荐阅读