Microsoft SQL Server多表查询结果列值分组合并为逗号分隔字符串
问题场景
我在使用Microsoft SQL Server,通过连接4张以上的表编写SELECT查询语句,得到的原始结果如下:
| column1 | column2 | column3 | column4 |
|---|---|---|---|
| 1 | File1 | Table1 | Column1 |
| 1 | File1 | Table1 | Column2 |
| 1 | File1 | Table2 | Column1 |
需要将column4的不同值按column1、column2、column3分组合并为逗号分隔的字符串,期望得到结果:
| column1 | column2 | column3 | column4 |
|---|---|---|---|
| 1 | File1 | Table1 | Column1, Column2 |
| 1 | File1 | Table2 | Column1 |
解决方案
方法1:使用STRING_AGG(SQL Server 2017及以上版本)
这是最简洁高效的方式,利用SQL Server内置的字符串聚合函数直接实现分组拼接:
SELECT column1, column2, column3, STRING_AGG(column4, ', ') AS column4 FROM ( -- 替换为你的4表连接查询语句 SELECT column1, column2, column3, column4 FROM 表1 JOIN 表2 ON 表1.关联字段 = 表2.关联字段 JOIN 表3 ON 表2.关联字段 = 表3.关联字段 JOIN 表4 ON 表3.关联字段 = 表4.关联字段 -- 更多表连接条件按需添加 ) AS 原始查询结果 GROUP BY column1, column2, column3;
方法2:使用FOR XML PATH(兼容SQL Server 2016及更早版本)
如果你的SQL Server版本不支持STRING_AGG,可以用XML拼接的方式实现:
SELECT DISTINCT column1, column2, column3, STUFF( (SELECT ', ' + column4 FROM ( -- 替换为你的4表连接查询语句 SELECT column1, column2, column3, column4 FROM 表1 JOIN 表2 ON 表1.关联字段 = 表2.关联字段 JOIN 表3 ON 表2.关联字段 = 表3.关联字段 JOIN 表4 ON 表3.关联字段 = 表4.关联字段 ) AS 子查询结果 WHERE 子查询结果.column1 = 主查询结果.column1 AND 子查询结果.column2 = 主查询结果.column2 AND 子查询结果.column3 = 主查询结果.column3 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '' ) AS column4 FROM ( -- 替换为你的4表连接查询语句 SELECT column1, column2, column3, column4 FROM 表1 JOIN 表2 ON 表1.关联字段 = 表2.关联字段 JOIN 表3 ON 表2.关联字段 = 表3.关联字段 JOIN 表4 ON 表3.关联字段 = 表4.关联字段 ) AS 主查询结果;
内容的提问来源于stack exchange,提问作者Manikandan
相关产品推荐
相关产品推荐

