SQL Server-获取管理结构的迭代过程
我的数据库中有一个表,它映射了这样一个管理结构SQL Server-获取管理结构的迭代过程,sql,sql-server,iteration,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的管理者,等等 我想从
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
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 y
12 15 n
15 N/A n
为了能够实现这一点,如果staffid 8是staffid,或者如果8在下面任何staffid的命令链中,我真的只需要将change标志设置为“y”。
同样地,对于给定的id 10,表将如下所示:
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 n
12 15 n
15 N/A n
staffid managerid change?
6 8 y
7 8 y
8 10 y
10 12 y
12 15 n
15 N/A n
我希望这已经足够清楚了,再次表示感谢
DS对于此类递归操作,您需要一个递归CTE。参见示例。这里是一个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
请参见不要使用迭代过程。这是实现这一点最慢的方法,显然不能扩展到几十行以外。添加一个HierarchyID列,为其编制索引并使用它执行子、祖先、级别等查询在支持HierarchyID的SQL Server版本中不需要递归CTE。就性能而言,它们并不比迭代方法好多少,因为它们在逻辑上是等价的。这个问题是你所说的重复问题的一部分,但是这个问题需要硬币的两面,而不仅仅是下游,所以本质上这是一个不同的问题。谢谢各位的贡献。我在虚线下面列出了一些新的要求。如果您能考虑一下,我将不胜感激。