获取层次结构中每一行的级别 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;
我有一个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;