SQL 服务器 - 获取管理结构的迭代过程
SQL Server - Iterative procedure to get management structure
我的数据库中有一个 table 映射了这样的管理结构。
staffid managerid
14 15
13 15
12 15
11 12
10 12
9 10
8 10
7 8
6 8
5 9
4 9
所以你可以看到一种命令链,其中 10 是 8 和 9 的经理,9 是 5 和 4 的经理,依此类推
我想从给定id的角度看管理结构。
例如,我想从 8 的角度来看,我希望看到这样的东西:6、7、8、10、12、15
或者从4的角度来看另一个例子,我会看到:4,9,10,12,15
这有意义吗? - 你只会看到你是其经理的人,谁是你的经理,谁是他们的经理等等。
有人可以帮助 sql 生成此列表吗?我想我需要某种迭代函数来传递一个 id 并循环,直到我找到一个链中没有人的 id,然后再进行备份。我只是不确定如何开始。
非常感谢。
DS
----------------
感谢 Jaques 提供了我最终用来解决我在命令链中显示员工的问题的东西,以及所有其他做出贡献的人。非常感谢。
我现在有第二部分已经曝光,希望有人也能帮助我。
因此,例如,我想从 8 的角度来看,我希望看到如下所示的内容:
给定的员工应该能够更改他们自己的经理 ID,以及指挥链中低于他们的任何员工的任何经理 ID。
所以对于员工 ID 8,我正在寻找这样的东西:
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 n
12 15 n
15 N/A n
为了能够实现这一点,我真的只需要更改标志为 'y' 如果 staffid 8 是 staffid 或者如果 8 在它下面的任何 staffid 的命令链中。
同样,对于给定的 id 10,table 将如下所示:
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 y
12 15 n
15 N/A n
我希望已经足够清楚了,再次感谢您。
DS
您需要递归 CTE 来进行此类递归操作。请参阅 this 示例。
这是您可以使用的 CTE 示例。
DECLARE @staffid int = 8;
WITH n(staffid, managerid) AS
(SELECT staffid, managerid
FROM t1
WHERE staffid = @staffid
UNION ALL
SELECT nplus1.staffid, nplus1.managerid
FROM t1 as nplus1
inner join n on n.staffid = nplus1.managerid
),
m(staffid, managerid) AS
(SELECT staffid, managerid
FROM t1
WHERE staffid = @staffid
UNION ALL
SELECT nplus1.staffid, nplus1.managerid
FROM t1 as nplus1
inner join m on m.managerid = nplus1.staffid
)
SELECT staffid FROM n
UNION
SELECT staffid from m
我的数据库中有一个 table 映射了这样的管理结构。
staffid managerid
14 15
13 15
12 15
11 12
10 12
9 10
8 10
7 8
6 8
5 9
4 9
所以你可以看到一种命令链,其中 10 是 8 和 9 的经理,9 是 5 和 4 的经理,依此类推
我想从给定id的角度看管理结构。
例如,我想从 8 的角度来看,我希望看到这样的东西:6、7、8、10、12、15
或者从4的角度来看另一个例子,我会看到:4,9,10,12,15
这有意义吗? - 你只会看到你是其经理的人,谁是你的经理,谁是他们的经理等等。
有人可以帮助 sql 生成此列表吗?我想我需要某种迭代函数来传递一个 id 并循环,直到我找到一个链中没有人的 id,然后再进行备份。我只是不确定如何开始。
非常感谢。
DS
----------------
感谢 Jaques 提供了我最终用来解决我在命令链中显示员工的问题的东西,以及所有其他做出贡献的人。非常感谢。
我现在有第二部分已经曝光,希望有人也能帮助我。 因此,例如,我想从 8 的角度来看,我希望看到如下所示的内容:
给定的员工应该能够更改他们自己的经理 ID,以及指挥链中低于他们的任何员工的任何经理 ID。
所以对于员工 ID 8,我正在寻找这样的东西:
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 n
12 15 n
15 N/A n
为了能够实现这一点,我真的只需要更改标志为 'y' 如果 staffid 8 是 staffid 或者如果 8 在它下面的任何 staffid 的命令链中。 同样,对于给定的 id 10,table 将如下所示:
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 y
12 15 n
15 N/A n
我希望已经足够清楚了,再次感谢您。
DS
您需要递归 CTE 来进行此类递归操作。请参阅 this 示例。
这是您可以使用的 CTE 示例。
DECLARE @staffid int = 8;
WITH n(staffid, managerid) AS
(SELECT staffid, managerid
FROM t1
WHERE staffid = @staffid
UNION ALL
SELECT nplus1.staffid, nplus1.managerid
FROM t1 as nplus1
inner join n on n.staffid = nplus1.managerid
),
m(staffid, managerid) AS
(SELECT staffid, managerid
FROM t1
WHERE staffid = @staffid
UNION ALL
SELECT nplus1.staffid, nplus1.managerid
FROM t1 as nplus1
inner join m on m.managerid = nplus1.staffid
)
SELECT staffid FROM n
UNION
SELECT staffid from m