我有一张这样的桌子
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
答案 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;