如何将表B的trait字段聚合为CSV字段关联到表A?
如何将关联表字段聚合为CSV格式并关联主表
给定两张关联表:
表A(主表)
pk name 1 Peter 2 Jon
表B(关联表,通过fk_A关联表A的pk)
pk trait fk_A 1 funny 1 2 generous 1 3 rude 2
期望生成的结果集:
pk name traits 1 Peter funny,generous 2 Jon rude
核心需求是将表B中同一fk_A对应的trait字段聚合为逗号分隔的字符串,作为traits字段关联到表A。以下是不同数据库引擎的实现方案:
不同数据库的实现代码
MySQL/MariaDB
使用GROUP_CONCAT函数完成字符串聚合,配合分组查询:
SELECT a.pk, a.name, GROUP_CONCAT(b.trait SEPARATOR ',') AS traits FROM 表A a LEFT JOIN 表B b ON a.pk = b.fk_A GROUP BY a.pk, a.name;
若需对聚合字段去重,可改为
GROUP_CONCAT(DISTINCT b.trait SEPARATOR ',')
PostgreSQL
使用STRING_AGG函数,支持指定排序顺序:
SELECT a.pk, a.name, STRING_AGG(b.trait, ',' ORDER BY b.trait) AS traits FROM 表A a LEFT JOIN 表B b ON a.pk = b.fk_A GROUP BY a.pk, a.name;
SQL Server(2017及以上版本)
使用STRING_AGG函数,通过WITHIN GROUP指定排序:
SELECT a.pk, a.name, STRING_AGG(b.trait, ',') WITHIN GROUP (ORDER BY b.trait) AS traits FROM 表A a LEFT JOIN 表B b ON a.pk = b.fk_A GROUP BY a.pk, a.name;
Oracle(11g及以上版本)
使用LISTAGG函数实现聚合:
SELECT a.pk, a.name, LISTAGG(b.trait, ',') WITHIN GROUP (ORDER BY b.trait) AS traits FROM 表A a LEFT JOIN 表B b ON a.pk = b.fk_A GROUP BY a.pk, a.name;
内容的提问来源于stack exchange,提问作者R-obert
相关产品推荐
相关产品推荐

