Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 计数循环通过EMP\U MGR层次结构,直到MGR\U ID=CO\U ID_Sql_Loops_Recursion_Sql Server 2012_Hierarchical Data - Fatal编程技术网

Sql 计数循环通过EMP\U MGR层次结构,直到MGR\U ID=CO\U ID

Sql 计数循环通过EMP\U MGR层次结构,直到MGR\U ID=CO\U ID,sql,loops,recursion,sql-server-2012,hierarchical-data,Sql,Loops,Recursion,Sql Server 2012,Hierarchical Data,我有一个问题,我还没有找到一个好的答案。看起来递归是关键,但有一些计数和if我不确定如何实现。这一切都在SQL Server 2012中完成 有两个表,M0是一个ID 表1:EMP_经理 EMP_Name | EMP_ID | EMP_Email | MGR_Name | MGR_ID | MGR_Email 表2:CO_SPOC CO_Name | CO_M0 | CO_Email | SPOC | SPOC_M0 | SPOC_Email 问题是我们需要一个循环,将员工和经理作为一个步骤

我有一个问题,我还没有找到一个好的答案。看起来递归是关键,但有一些计数和if我不确定如何实现。这一切都在SQL Server 2012中完成

有两个表,M0是一个ID

表1:EMP_经理

EMP_Name | EMP_ID | EMP_Email | MGR_Name | MGR_ID | MGR_Email
表2:CO_SPOC

CO_Name | CO_M0 | CO_Email | SPOC | SPOC_M0 | SPOC_Email
问题是我们需要一个循环,将员工和经理作为一个步骤来看待。这是第一步。如果经理是CO(并非所有经理都是CO),那么这就是顶部和末端。我们想计算一名员工与公司经理之间的距离。如果该经理不是公司,它会循环检查他们的经理是否是公司。阶梯越低,距离越高

EMP_M0     MGR_M0     CO_M0     Steps
   1          2        null       2
   2          3        null       1
   3          4         4         0
我使用这个连接来构建EMP_M0、MGR_M0、CO_M0表

select EMP_MGR.EMP_M0, EMP_MGR.MGR_M0, CO_SPOC.CO_M0
       from EMP_MGR left join CO_SPOC
              on EMP_MGR.MGR_M0 = CO_SPOC.CO_M0
       order by EMP_MGR.EMP_M0
我如何循环计算“世代”?然后重复,直到MGR_M0=CO_M0。然后在整个集合中重复该操作,从具有最高步数的最低员工和MGR_M0=CO_M0=0分配降序值

谢谢你的任何想法或帮助

编辑::如果这对示例数据不起作用,请告诉我

declare @EMP_MGR table(EMP_Name varchar(64), EMP_M0 varchar(64), Emp_Email varchar(64), MGR_Name varchar(64), MGR_M0 varchar(64), MGR_Email varchar(64))

insert into @EMP_MGR
values
('Jake','M01111','Jake@work.org','John','M01112','John@work.org'),
('John','M01112','John@work.org','Johny','M01113','Johny@work.org'),
('Johny','M01114','Johny@work.org','Jimmy','M01115','Jimmy@work.org'),
('Jimmy','M01115','Jimmy@work.org','Steve','M00111','Steve@work.org'),
('Steve','M00111','Steve@work.org',null,null, null),
('Joslin','M01216','Joslin@work.org','Jasmine','M01217','Jasmine@work.org'),
('Jasmine','M01217','Jasmine@work.org','Jane','M01319','Jane@work.org'),
('Jane','M01319','Jane@work.org','Steve','M00111','Steve@work.org'),
('Jana','M01419','Jana@work.org','Josh','M01420','Josh@work.org'),
('Josh','M01420','Josh@work.org','Steve','M00111','Steve@work.org'),
('Jessica','M01421','Jessica@work.org','Jerry','M01422','Jerry@work.org'),
('Jerry','M01422','Jerry@work.org','Jordon','M01423','Jordon@work.org'),
('Jordon','M01423','Jordon@work.org','Jay','M01424','Jay@work.org'),
('Jay','M01424','Jay@work.org','Steve','M00111','Steve@work.org')

declare @CO_SPOC table (CO_Name varchar(64), CO_M0 varchar(64), CO_Email varchar(64), SPOC varchar(64), SPOC_M0 varchar(64), SPOC_Email varchar(64))
insert into @CO_SPOC
values
('Jimmy','M01115','Jimmy@work.org','Frank','M01911','Frank@work.org'),
('Jane','M01319','Jane@work.org','Francine','M01984','Francine@work.org'),
('Josh','M01420','Josh@work.org','Frank','M01911','Frank@work.org'),
('Jay','M01424','Jay@work.org','Fred','M01943','Fred@work.org')

样本数据和结果会有所帮助。这当然可以通过递归cte实现,但需要样本数据才能得到精确的查询。@Serg我为你们添加了一些样本数据。谢谢@西蒙,我为你们添加了一些样本数据。谢谢此示例数据不适合您的模式,因此递归对其不起作用。填充已显示问题的表格。样本数据和结果会有所帮助。这当然可以通过递归cte实现,但需要样本数据才能获得准确的查询。@Serg我为你们添加了一些样本数据。谢谢@西蒙,我为你们添加了一些样本数据。谢谢此示例数据不适合您的模式,因此递归对其不起作用。填充已显示问题的表格。