【发布时间】:2025-11-27 11:10:02
【问题描述】:
我有一个必须进行的更新。我真的卡住了。 这是一个经典的分层员工表问题,但有一个转折点。 请查看此用户树: employees
(与我的问题完全无关,只是我用谷歌图片找到的)
让我们假设以下 ID:
RM1: EmpId 1, ParentId null
AM1: EmpId 2, ParentId 1
MGR1: EmpId 3, ParentId 2
MGR2: EmpId 4, ParentId 2
EMP1: EmpId 5, ParentId 3
EMP2: EmpId 6, ParentId 3
EMP3: EmpId 7, ParentId 4
EMP4: EmpId 8, ParentId 4
我需要添加另一列,我们称之为 parentSpecialId。 此 id 是 root 以下用户的 id(AM1 和 AM2)。 AM1 和 AM2 以下的所有用户都应将 parentSpecialId 设置为 root 以下的用户。
这给了我们:
RM1: EmpId 1, ParentId null parentSpecialId null
AM1: EmpId 2, ParentId 1 parentSpecialId null
MGR1: EmpId 3, ParentId 2 parentSpecialId 2
MGR2: EmpId 4, ParentId 2 parentSpecialId 2
EMP1: EmpId 5, ParentId 3 parentSpecialId 2
EMP2: EmpId 6, ParentId 3 parentSpecialId 2
EMP3: EmpId 7, ParentId 4 parentSpecialId 2
EMP4: EmpId 8, ParentId 4 parentSpecialId 2
我只有这个 CTE,它给了我一个带有 AM1 和 AM2 的结果集。 所以我需要一直遍历到 EMPX 并使用 Id 2 更新 parentSpecialId AM1 和 AM2 的所有用户相同。当然,它需要动态的,在现实生活中我有 12 个这样的用户在 root 下。
有意义吗?
这是我的 CTE:
WITH EmpsCTE AS
(
SELECT id, parent, name, 0 AS EmployeeLevel
FROM Employee
WHERE parent = 0
UNION ALL
SELECT e.id, e.parent, e.name, EmployeeLevel + 1
FROM EmpsCTE AS p
JOIN Employee AS e ON e.parent = p.id
)
SELECT id, parent, name, EmployeeLevel
From EmpsCTE where EmployeeLevel = 1
哦,我用的是 Sql server 2008 R2
【问题讨论】:
-
有关更奇怪的示例,演示如何生成从 Lord High Executioner (RM1) 到 Peasant (EMP*) 的完整路径,请查看 this 帖子。
标签: sql-server tsql hierarchical-data