【发布时间】:2020-12-19 04:37:39
【问题描述】:
问题:如何获取每一行的 top dept_id。
输入数据
+---------+------------+----------+
| Dept_ID | PR_Dept_ID | DeptName |
+---------+------------+----------+
| 0000 | null | HR00 |
| 0001 | 0000 | HR01 |
| 0002 | 0000 | HR02 |
| 0003 | 0002 | HR03 |
| 0004 | 0002 | HR04 |
| 0005 | 0004 | HR05 |
| 0006 | null | INV00 |
| 0007 | 0006 | INV01 |
| 0008 | 0007 | INV02 |
+---------+------------+----------+
树级
HR00
HR01
HR02
HR03
HR04
HR05
INV00
INV01
INV02
预期结果:
+---------+------------+----------+-------------+
| Dept_ID | PR_Dept_ID | DeptName | top_Dept_ID |
+---------+------------+----------+-------------+
| 0000 | null | HR00 | null |
| 0001 | 0000 | HR01 | 0000 |
| 0002 | 0000 | HR02 | 0000 |
| 0003 | 0002 | HR03 | 0000 |
| 0004 | 0002 | HR04 | 0000 |
| 0005 | 0004 | HR05 | 0000 |
| 0006 | null | INV00 | null |
| 0007 | 0006 | INV01 | 0006 |
| 0008 | 0007 | INV02 | 0006 |
+---------+------------+----------+-------------+
我尝试过并遇到的问题:
如果行数据的级别没有改变,那么我可以使用join * level count 来解决问题。但现在是dynamic level,例如HR等级4,INV等级3,我这里有问题。
如果有人能给我一个关键字或逻辑,我将不胜感激。
在线测试链接:SQL Server 2017 | db<>fiddle
【问题讨论】:
-
关键字:递归 CTE。问题,你为什么使用 varchar 作为你的父 id 列?
-
@Dale K,你好,这是一个演示,所以在现实世界中类型可以是 uid 或 int
-
递归 CTE 将创建更多行,这与本例中的目标不匹配
-
@Wei 你自己做的——干得好! (你可以看到它将如何简化使用 int 而不是 varchar 的东西)。
标签: sql sql-server