如何用SQL按ORDER_ID分组拼接同组所有CODE为单条记录?
分组拼接CODE的SQL实现方案
不同数据库的字符串分组聚合函数略有差异,主流数据库的实现代码如下:
MySQL 环境
使用GROUP_CONCAT函数实现:
SELECT T1.ID AS ORDER_ID, GROUP_CONCAT(T2.CODE SEPARATOR ',') AS CODE FROM SCHEMA.TABLE1 AS T1 LEFT JOIN SCHEMA.TABLE2 AS T2 ON T1.ID = T2.O_ID GROUP BY T1.ID
如果需要指定CODE的拼接顺序,可在函数内加排序规则,示例:GROUP_CONCAT(T2.CODE ORDER BY T2.CODE ASC SEPARATOR ',')
PostgreSQL / 华为GaussDB(兼容PG模式) / Greenplum 环境
使用STRING_AGG函数实现:
SELECT T1.ID AS ORDER_ID, STRING_AGG(T2.CODE, ',' ORDER BY T2.CODE) AS CODE FROM SCHEMA.TABLE1 AS T1 LEFT JOIN SCHEMA.TABLE2 AS T2 ON T1.ID = T2.O_ID GROUP BY T1.ID
Oracle 11g及以上环境
使用LISTAGG函数实现:
SELECT T1.ID AS ORDER_ID, LISTAGG(T2.CODE, ',') WITHIN GROUP (ORDER BY T2.CODE) AS CODE FROM SCHEMA.TABLE1 AS T1 LEFT JOIN SCHEMA.TABLE2 AS T2 ON T1.ID = T2.O_ID GROUP BY T1.ID
SQL Server 2017及以上 / Azure SQL 环境
使用STRING_AGG函数实现:
SELECT T1.ID AS ORDER_ID, STRING_AGG(T2.CODE, ',') WITHIN GROUP (ORDER BY T2.CODE) AS CODE FROM SCHEMA.TABLE1 AS T1 LEFT JOIN SCHEMA.TABLE2 AS T2 ON T1.ID = T2.O_ID GROUP BY T1.ID
通用注意事项
- 如果需要过滤掉NULL的CODE值,可在JOIN后添加
WHERE T2.CODE IS NOT NULL条件,避免拼接结果出现多余空值 - 如果存在重复的CODE需要去重,可在聚合字段前添加
DISTINCT关键字,示例:GROUP_CONCAT(DISTINCT T2.CODE SEPARATOR ',') - 部分数据库对聚合后的字符串长度有默认限制,超出限制时需要调整对应数据库的参数配置
内容的提问来源于stack exchange,提问作者Karina
相关产品推荐
相关产品推荐

