这是我的SQL Server表
ID Job ParentID MyTeam
1 CEO NULL
2 CFO 1
3 CTO 1
4 CMO 1
5 Accounting Manager 2
6 Payroll Manager 2
7 Data Manager 3
8 Software Manager 3
9 Data Analyst 7
10 Data Engineer 7
我需要以这种方式填写“我的团队”字段
每一个工作都将由该工作所有人员管理
首席执行官的团队将
CFO的团队将是CFO, Accounting Manager, Payroll Manager
首席技术官的团队将是CTO, Data Manager, Software Manager, Data Analyst, Data Engineer
我在此数据上构建了一个循环,并将每个作业与其父作业联系起来,以此类推
但这太慢了
是否有一个更快的更新语句可以快速完成此操作
2条答案
按热度按时间piv4azn71#
此方法使用循环,但速度应该相对较快
在this dbfiddle中,有一些运行这种方法的示例,并带有一些额外的报告
每个“轮”的数据(例如,循环中的迭代数)被插入到#EmpParents表中。
该方法是a)首先包括基本作业和父作业b)然后对于父作业,识别它们的父重复b)直到没有找到更多的父作业。
它查找“父的父”的方法是查看循环中的最后一个“轮”,以从该轮中获取每个作业的父ID;在下一轮中,它使用这些新的父节点来识别下一级父节点。
注意,我用WHILE循环来做这个,因为我认为它更容易阅读/理解。然而,你也可以用CURSOR或递归CTE来做这个--但它们毕竟是循环的变体。
请注意,在最终报告中,它使用最后一列(ParentID)作为主列,并查找与之对应的所有作业ID。
以下是结果
最后注意:这里没有错误检查,并且假设是一个层次结构(例如,你不能有一个父循环,例如,我的下属是我老板的老板)。你可能想在循环中加入一些错误检查/etc来控制它。一个简单的方法是,如果
RoundNum
达到一个不可能的不切实际的高数字(例如,50),那么它会因为错误而中止。dz6r00yl2#
您可以使用递归CTE来执行此操作。
首先,获取所有的雇员,并使用递归为每个雇员获取其子行(如果有的话)。注意,这里我们没有进行任何循环检查,假设没有循环。
然后按开始时的顶级ID聚合它,并将其联接回主表。
您还可以通过计算CTE中的
Level
列来强制执行排序db<>fiddle