获取分层表sql中每行的级别

问题描述 投票:1回答:1

我有一张这样的桌子

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

sql sql-server-2012 hierarchical-data
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.