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

如何在T-SQL中实现树形菜单结构的层级缩进导出?

用递归CTE实现树形结构的缩进输出

嘿,这个需求我太熟了!完全不用纠结游标那种依赖子节点数量的方案——递归CTE(公共表表达式) 就是解决这类树形结构格式化的最优解,它能自动适配任意深度的层级,完全不用硬编码子节点的层数。

核心思路

递归CTE分成两部分协作:

  1. 锚点成员:先定位所有根节点(也就是parent=0的记录),同时初始化层级为1,作为树形结构的起点。
  2. 递归成员:自动遍历每个节点的子节点,每往下一层层级就+1,用层级数计算对应数量的缩进空格,同时生成排序用的路径键保证树形顺序。

具体实现代码

假设你的原表名为original_tree,要导出到的新表名为formatted_menu,可以用下面的SQL:

-- 先创建用于存储结果的新表(如果还没创建)
CREATE TABLE formatted_menu (
    display_text VARCHAR(100)
);

-- 用递归CTE生成带缩进的树形结构,插入新表
WITH recursive_tree AS (
    -- 锚点:根节点,层级1,无缩进,初始化节点路径用于排序
    SELECT 
        id,
        parent,
        1 AS level,
        CAST(id AS VARCHAR(100)) AS display_text,
        CAST(id AS VARCHAR(100)) AS node_path
    FROM original_tree
    WHERE parent = 0
    
    UNION ALL
    
    -- 递归:遍历子节点,层级+1,添加4个空格缩进,更新节点路径
    SELECT 
        t.id,
        t.parent,
        rt.level + 1 AS level,
        CAST(CONCAT(SPACE(4*(rt.level)), t.id) AS VARCHAR(100)) AS display_text,
        CAST(CONCAT(rt.node_path, '.', t.id) AS VARCHAR(100)) AS node_path
    FROM original_tree t
    JOIN recursive_tree rt ON t.parent = rt.id
)
-- 按节点路径排序,保证父节点在前、子节点紧跟的树形顺序
INSERT INTO formatted_menu (display_text)
SELECT display_text
FROM recursive_tree
ORDER BY node_path;

执行结果

插入完成后,查询formatted_menu就能得到你想要的树形结构:

display_text
-------------
1
    3
        4
2
    5

方案优势

  • 适配任意深度:不管你的树有多少层子节点,递归CTE都会自动处理,不用修改代码。
  • 性能更优:相比游标逐行处理,递归CTE是数据库原生优化的操作,执行效率更高。
  • 灵活扩展:如果需要在显示文本里加入名称等其他字段,只需要修改display_text的拼接逻辑就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:34:18