我的数据库中有一个映射管理结构的表。
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
答案 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示例。