如何合并多行列值并仅返回单行?SQL多行列拼接技术问询
解决方案
针对你需要将多表关联后的多行结果拼接成单行的需求,不同数据库有对应的字符串聚合函数可以实现,无需硬编码pivot值,以下是各主流数据库的实现方案:
MySQL/MariaDB
使用GROUP_CONCAT函数实现分组拼接:
SELECT Table1.ID, GROUP_CONCAT(CONCAT(Table2.Col, ' , ', Table3.Col) SEPARATOR ' ; ') AS combined_cols FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID INNER JOIN Table3 ON Table2.ID = Table3.ID AND Table2.Col != Table3.Col GROUP BY Table1.ID;
SEPARATOR用于指定不同行拼接结果之间的分隔符,可根据需求替换(比如换成', ')- 若需去重拼接内容,可添加
DISTINCT:GROUP_CONCAT(DISTINCT CONCAT(Table2.Col, ' , ', Table3.Col) SEPARATOR ' ; ')
SQL Server 2017+/Azure SQL
使用STRING_AGG函数:
SELECT Table1.ID, STRING_AGG(CONCAT(Table2.Col, ' , ', Table3.Col), ' ; ') AS combined_cols FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID INNER JOIN Table3 ON Table2.ID = Table3.ID AND Table2.Col != Table3.Col GROUP BY Table1.ID;
STRING_AGG是SQL Server 2017及以后版本支持的原生聚合函数,语法简洁直观
Oracle 11gR2+
使用LISTAGG函数:
SELECT Table1.ID, LISTAGG(CONCAT(Table2.Col, ' , ', Table3.Col), ' ; ') WITHIN GROUP (ORDER BY Table2.Col) AS combined_cols FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID INNER JOIN Table3 ON Table2.ID = Table3.ID AND Table2.Col != Table3.Col GROUP BY Table1.ID;
WITHIN GROUP (ORDER BY ...)用于指定拼接的顺序,保证结果的一致性
PostgreSQL
使用STRING_AGG函数:
SELECT Table1.ID, STRING_AGG(CONCAT(Table2.Col, ' , ', Table3.Col), ' ; ') AS combined_cols FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID INNER JOIN Table3 ON Table2.ID = Table3.ID AND Table2.Col != Table3.Col GROUP BY Table1.ID;
- 支持通过
ORDER BY指定拼接顺序:STRING_AGG(..., ' ; ') ORDER BY Table2.Col
注意事项
- 部分数据库对聚合后的字符串长度有默认限制(比如MySQL的
GROUP_CONCAT默认最大长度为1024),若需要拼接更长内容,需调整对应配置参数 - 可根据实际需求修改
CONCAT里的分隔符(比如把' , '换成其他符号)
内容的提问来源于stack exchange,提问作者ctorSharp
相关产品推荐
相关产品推荐

