Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-获取管理结构的迭代过程_Sql_Sql Server_Iteration - Fatal编程技术网

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。就性能而言,它们并不比迭代方法好多少,因为它们在逻辑上是等价的。这个问题是你所说的重复问题的一部分,但是这个问题需要硬币的两面,而不仅仅是下游,所以本质上这是一个不同的问题。谢谢各位的贡献。我在虚线下面列出了一些新的要求。如果您能考虑一下,我将不胜感激。