SQL Server - 获取管理结构的迭代过程

时间:2015-01-09 11:50:55

标签: sql sql-server iteration

我的数据库中有一个映射管理结构的表。

 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的id,然后重新开始工作。我只是不确定如何开始。

非常感谢。

DS

--------------

感谢Jaques提供了我最终用于解决我在一个指挥链中展示员工的问题,以及所有其他贡献者。非常感谢。

我现在有第二部分已经曝光,希望有人也可以帮助我。 例如,我想从8的观点来看,我希望看到下面的内容:

给定的员工应该能够在指挥链中更改自己的经理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'如果工作人员8是工作人员,或者如果8人在其下面的任何工作人员的指挥链中。 同样,对于给定的id为10,表格看起来像这样:

staffid     managerid      change?
6           8              y
7           8              y
8           10             y
10          12             y
12          15             n
15          N/A            n

我希望这很清楚,再次,非常感谢提前。

DS

2 个答案:

答案 0 :(得分:2)

以下是您可以使用的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

答案 1 :(得分:0)

这种递归操作需要递归CTE。请参阅this示例。