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

如何在不支持STRING_AGG的SQL Server中从父子表生成完全限定地名

实现递归生成地名的完全限定名称(FQName)(SQL Server 无STRING_AGG支持)

可以用递归CTE实现需求,核心思路是从顶级节点(无父节点)出发,逐层向下拼接子节点与父节点的完全限定名称,最终得到每个节点的完整路径。以下是具体实现代码:

-- 假设表名为 Locations
WITH RecursiveLocations AS (
    -- 锚点成员:处理所有顶级节点(无父节点)
    SELECT 
        id,
        name,
        parent_id,
        parent_name,
        CAST(name AS VARCHAR(MAX)) AS FQName
    FROM Locations
    WHERE parent_id IS NULL

    UNION ALL

    -- 递归成员:子节点拼接父节点的FQName
    SELECT 
        l.id,
        l.name,
        l.parent_id,
        l.parent_name,
        CAST(l.name + ', ' + r.FQName AS VARCHAR(MAX)) AS FQName
    FROM Locations l
    INNER JOIN RecursiveLocations r 
        ON l.parent_id = r.id -- 通过父ID关联,比parent_name更可靠
)
-- 查询最终结果
SELECT 
    id,
    name,
    parent_id,
    parent_name,
    FQName
FROM RecursiveLocations
ORDER BY id;

代码说明:

  • 锚点成员:先筛选出所有parent_id IS NULL的顶级区域,它们的FQName就是自身名称。
  • 递归成员:将每个子节点与递归CTE中已生成的父节点记录关联,把当前节点名称和父节点的FQName用, 拼接,形成当前节点的完全限定名称。使用CAST(..., VARCHAR(MAX))是为了避免字符串长度溢出,适配多层级的场景。
  • 最终查询:返回所有节点的完整信息及生成的FQName,按ID排序后与示例输出一致。

适配场景:

  • 支持任意层级的地名结构(比如示例中的4层级,或者以色列的3层级)。
  • 无需依赖STRING_AGG函数,兼容不支持该函数的SQL Server版本(如2016及更早版本)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:12:43