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