如何在不支持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
相关产品推荐
相关产品推荐

