如何用SQL将data A列的行值合并为统一的data B列?
SQL查询修改求助
现有SQL表tbl_test,data A列包含apple、banana、cat等值,我想通过SQL查询生成data B列,让每行的data B都是data A列所有行值的合并字符串(格式示例:apple, banana, cat)。
期望输出
| data A | data B |
|---|---|
| apple | apple, banana, cat |
| banana | apple, banana, cat |
| cat | apple, banana, cat |
当前写的查询语句
SELECT data A, '' as data B From tbl_test;
请问该怎么修改这个查询语句才能实现需求?我SQL基础比较弱,麻烦指导下。
解决方案
不同数据库的字符串聚合函数不一样,下面是几种常用数据库的实现方式:
MySQL/MariaDB
用GROUP_CONCAT()函数,通过子查询获取所有data A的合并值:
SELECT `data A`, (SELECT GROUP_CONCAT(`data A` SEPARATOR ', ') FROM tbl_test) AS `data B` FROM tbl_test;
- 注意:列名带空格时,必须用反引号
`把列名包起来 SEPARATOR ', '是指定合并时用逗号加空格分隔,和你要的格式一致
PostgreSQL
用STRING_AGG()函数:
SELECT "data A", (SELECT STRING_AGG("data A", ', ') FROM tbl_test) AS "data B" FROM tbl_test;
- 列名带空格时用双引号
"包裹(要注意数据库的标识符大小写规则)
SQL Server(2017及以上版本)
用STRING_AGG()函数,还可以指定排序:
SELECT [data A], (SELECT STRING_AGG([data A], ', ') WITHIN GROUP (ORDER BY [data A])) AS [data B] FROM tbl_test;
- 列名带空格时用方括号
[]包裹 WITHIN GROUP (ORDER BY [data A])可以让合并的字符串按data A排序,不想排序的话可以删掉这部分
Oracle
用LISTAGG()函数:
SELECT "data A", (SELECT LISTAGG("data A", ', ') WITHIN GROUP (ORDER BY "data A") FROM tbl_test) AS "data B" FROM tbl_test;
内容的提问来源于stack exchange,提问作者Social Share
相关产品推荐
相关产品推荐

