sql - 获取分层表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
解决方案
我们可以使用递归 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;
演示
推荐阅读
- java - 如何使用 Java 在 IBM MQ 中循环读取消息
- symfony - 自定义端点的 Swagger 文档
- jquery - 切换具有相同类的多个 li 的特定元素
- apache - 未定义对 'uuid_generate@UUID_1.0 的引用
- javascript - 将对象转换为对象数组
- vagrant - 来自同一个 Vagrantfile 的多台机器
- java - 使用命令提示符运行 pmml 到 java 失败
- protractor - 如何以量角器形式编写代码?
- python - Flask 保存一个空文件
- c# - C# 我是否应该公开我的 windows 窗体事件相关的私有函数只是为了测试目的?