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

MySQL同表递归查询并拼接列的实现需求及问题

树形结构路径字段递归拼接实现

现有表结构

id        |  parentid     | Name
1         |  NULL         | W
2         |  1            | O
3         |  1            | R
4         |  2            | L
5         |  4            | D

需求

递归追溯每条记录的parentid直至根节点(parentid为NULL),将途经的所有Name字段按层级顺序拼接为Code列,期望结果如下:

id        |  parentid     | Name | Code
1         |  NULL         | W    | W
2         |  1            | O    | W,O
3         |  1            | R    | W,R
4         |  2            | L    | W,O,L
5         |  4            | D    | W,O,L,D

错误尝试的SQL

WITH RECURSIVE cte as 
( 
    SELECT  id, 
            id nextid, 
            parentid
    FROM    table
    UNION ALL
    SELECT  cte.id, 
            t1.id, 
            t1.parentid
    FROM    table
    JOIN    cte 
    ON      cte.parentid = p.id
)
SELECT Id, nextid RootId
FROM cte
WHERE parentid IS NULL

正确实现方案

递归CTE需要从每个节点向上追溯根节点,逐步拼接路径:

通用SQL(适配多数支持递归CTE的数据库)

WITH RECURSIVE cte AS (
    -- 初始化:所有记录的初始Code为自身Name
    SELECT 
        id,
        parentid,
        Name,
        CAST(Name AS VARCHAR(255)) AS Code
    FROM your_table
    UNION ALL
    -- 递归:关联父节点,将父节点Name拼到当前Code前
    SELECT 
        c.id,
        t.parentid,
        c.Name,
        CONCAT(t.Name, ',', c.Code) AS Code
    FROM cte c
    JOIN your_table t ON c.parentid = t.id
)
-- 筛选每个节点最终的完整路径(已追溯到根节点)
SELECT id, parentid, Name, Code
FROM cte
WHERE parentid IS NULL
ORDER BY id;

不同数据库的细节调整

  • MySQL:直接使用上述SQL即可,CONCAT函数支持多字符串拼接;
  • PostgreSQL:可替换CONCAT为字符串连接运算符||,即t.Name || ',' || c.Code;
  • SQL Server:字符串拼接可用CONCAT或+运算符,注意类型转换确保兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:01:11