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

如何用T-SQL按树形结构排序层级化员工数据?

员工树形结构排序实现

要实现既按字母顺序排列,又让员工紧随直属经理之后的树形展示效果,核心是生成每个员工的完整层级排序路径,通过路径字段实现排序。以下是具体解决方案:

模拟数据

SELECT 'Bart Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
SELECT 'Bruce' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel UNION
SELECT 'Donald' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel UNION
SELECT 'Homer Simpson' AS EmployeeName, 'Bruce' AS ManagerName, 3 AS OrgLevel UNION
SELECT 'Lisa Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
SELECT 'Maggie Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
SELECT 'Marge Simpson' AS EmployeeName, 'Homer Simpson' AS ManagerName, 4 AS OrgLevel UNION
SELECT 'Mr Burns' AS EmployeeName, '' AS ManagerName, 1 AS OrgLevel UNION
SELECT 'The Cat' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel

解决方案SQL

WITH OrgHierarchy AS (
    -- 锚点:顶级经理
    SELECT 
        EmployeeName,
        ManagerName,
        OrgLevel,
        CAST(EmployeeName AS VARCHAR(MAX)) AS SortPath
    FROM 
        (
            SELECT 'Bart Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
            SELECT 'Bruce' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel UNION
            SELECT 'Donald' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel UNION
            SELECT 'Homer Simpson' AS EmployeeName, 'Bruce' AS ManagerName, 3 AS OrgLevel UNION
            SELECT 'Lisa Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
            SELECT 'Maggie Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
            SELECT 'Marge Simpson' AS EmployeeName, 'Homer Simpson' AS ManagerName, 4 AS OrgLevel UNION
            SELECT 'Mr Burns' AS EmployeeName, '' AS ManagerName, 1 AS OrgLevel UNION
            SELECT 'The Cat' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel
        ) t
    WHERE ManagerName = ''

    UNION ALL

    -- 递归:关联下属,生成完整排序路径
    SELECT 
        t.EmployeeName,
        t.ManagerName,
        t.OrgLevel,
        CAST(oh.SortPath + '|' + t.EmployeeName AS VARCHAR(MAX)) AS SortPath
    FROM 
        (
            SELECT 'Bart Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
            SELECT 'Bruce' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel UNION
            SELECT 'Donald' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel UNION
            SELECT 'Homer Simpson' AS EmployeeName, 'Bruce' AS ManagerName, 3 AS OrgLevel UNION
            SELECT 'Lisa Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
            SELECT 'Maggie Simpson' AS EmployeeName, 'Marge Simpson' AS ManagerName, 5 AS OrgLevel UNION
            SELECT 'Marge Simpson' AS EmployeeName, 'Homer Simpson' AS ManagerName, 4 AS OrgLevel UNION
            SELECT 'Mr Burns' AS EmployeeName, '' AS ManagerName, 1 AS OrgLevel UNION
            SELECT 'The Cat' AS EmployeeName, 'Mr Burns' AS ManagerName, 2 AS OrgLevel
        ) t
    JOIN OrgHierarchy oh ON t.ManagerName = oh.EmployeeName
)
-- 按排序路径输出,添加缩进展示树形结构
SELECT 
    REPLICATE('  ', OrgLevel - 1) + EmployeeName AS DisplayName,
    OrgLevel,
    SortPath
FROM OrgHierarchy
ORDER BY SortPath;

效果说明

执行后会得到以下符合要求的树形排序结果(缩进体现层级):

  • Mr Burns
    • Bruce
      • Homer Simpson
        • Marge Simpson
          • Bart Simpson
          • Lisa Simpson
          • Maggie Simpson
    • Donald
    • The Cat

核心逻辑

  1. 递归生成排序路径:通过CTE递归,为每个员工生成包含从顶级经理到自身的完整名称路径,路径用分隔符(如|)拼接。
  2. 按路径排序:排序时直接使用SortPath,既保证经理在前、下属紧跟,又因为字符串默认按字母自然排序,同层级员工会自动按字母顺序排列。

内容的提问来源于stack exchange,提问作者Tommy Sharp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:30:27