You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:51:19