如何高效查询Azure SQL员工层级高度,无需逐个递归查询
一次性计算所有员工层级高度的高效方法
你当前的递归CTE是针对单个员工查询层级,若要批量获取所有员工的层级高度,更高效的方式是从根节点向下递归遍历,只需执行一次递归即可覆盖全量员工,无需重复查询。
适配你表结构的SQL实现
方式1:获取每个员工到根节点(CEO)的层级高度
WITH emp_hierarchy AS ( -- 根节点(ManagerId=-1的CEO)层级设为0 SELECT Id, ManagerId, Email, 0 AS 层级高度 FROM tableA WHERE ManagerId = -1 UNION ALL -- 递归遍历所有下属,层级逐层+1 SELECT e.Id, e.ManagerId, e.Email, eh.层级高度 + 1 FROM tableA e INNER JOIN emp_hierarchy eh ON e.ManagerId = eh.Id ) SELECT Id, Email, 层级高度 FROM emp_hierarchy ORDER BY 层级高度, Id;
方式2:获取每个员工到最底层下属的最大层级高度
如果需要的是员工自身到其最底层下属的层级差(即该员工的管理深度),可以用自底向上的递归实现:
WITH emp_hierarchy AS ( -- 叶子节点(无下属的员工)管理深度设为0 SELECT Id, ManagerId, Email, 0 AS 最大层级高度 FROM tableA WHERE Id NOT IN (SELECT ManagerId FROM tableA WHERE ManagerId != -1) UNION ALL -- 向上递归,取下属的最大层级值+1作为当前员工的管理深度 SELECT e.Id, e.ManagerId, e.Email, MAX(eh.最大层级高度) + 1 FROM tableA e INNER JOIN emp_hierarchy eh ON e.Id = eh.ManagerId GROUP BY e.Id, e.ManagerId, e.Email ) SELECT Id, Email, 最大层级高度 FROM emp_hierarchy ORDER BY 最大层级高度 DESC, Id;
性能优化建议
为了进一步提升递归查询的效率,建议给ManagerId字段创建非聚集索引:
CREATE NONCLUSTERED INDEX IX_tableA_ManagerId ON tableA(ManagerId);
这种批量计算的方式,时间复杂度为O(N)(N为员工总数),远低于逐个员工查询的O(N*K)(K为平均层级),尤其在员工数量较多时,性能提升会非常明显。
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

