如何关联所有者与共有人表 同列逗号分隔聚合展示共有人
你需要实现按所有者分组后,将关联的共有人姓名用英文逗号拼接聚合的需求,这类字符串聚合操作属于数据库方言功能,不同数据库的实现函数有差异,以下是主流数据库的可直接运行的写法,执行后可完全匹配你给出的期望输出:
各数据库实现代码
MySQL / MariaDB
使用GROUP_CONCAT函数完成聚合,默认分隔符为英文逗号,可通过SEPARATOR手动指定:
SELECT o.OwnerId AS Id, o.owners_Name, GROUP_CONCAT(c.`Co-OwnerName` ORDER BY c.id SEPARATOR ',') AS `Co-owners_Name` FROM Owners o LEFT JOIN `Co-Owners` c ON o.OwnerId = c.OwnerId GROUP BY o.OwnerId, o.owners_Name;
注意事项:
- 若需对共有人去重,可在函数内加
DISTINCT关键字:GROUP_CONCAT(DISTINCT c.Co-OwnerName...) - MySQL默认限制
GROUP_CONCAT返回结果最大长度为1024字节,共有人数据量大时可调整group_concat_max_len参数避免内容截断
PostgreSQL / SQL Server 2017及以上版本
支持SQL标准的STRING_AGG聚合函数:
-- PostgreSQL 写法 SELECT o.OwnerId AS Id, o.owners_Name, STRING_AGG(c."Co-OwnerName", ',' ORDER BY c.id) AS "Co-owners_Name" FROM Owners o LEFT JOIN "Co-Owners" c ON o.OwnerId = c.OwnerId GROUP BY o.OwnerId, o.owners_Name;
-- SQL Server 写法 SELECT o.OwnerId AS Id, o.owners_Name, STRING_AGG(c.[Co-OwnerName], ',') WITHIN GROUP (ORDER BY c.id) AS [Co-owners_Name] FROM Owners o LEFT JOIN [Co-Owners] c ON o.OwnerId = c.OwnerId GROUP BY o.OwnerId, o.owners_Name;
Oracle 11g及以上版本
使用LISTAGG函数实现拼接:
SELECT o.OwnerId AS Id, o.owners_Name, LISTAGG(c."Co-OwnerName", ',') WITHIN GROUP (ORDER BY c.id) AS "Co-owners_Name" FROM Owners o LEFT JOIN "Co-Owners" c ON o.OwnerId = c.OwnerId GROUP BY o.OwnerId, o.owners_Name;
Oracle 12cR2及以上版本可添加ON OVERFLOW TRUNCATE子句,避免拼接结果超长时报错
逻辑说明
- 关联时使用
LEFT JOIN可保证没有对应共有人的所有者也会出现在结果中,若仅需要存在共有人的所有者,替换为INNER JOIN即可 - 分组维度选择
OwnerId+owners_Name,符合数据库ONLY_FULL_GROUP_BY模式的语法要求 - 语句执行后返回结果与示例完全一致:
| Id | owners_Name | Co-owners_Name |
|---|---|---|
| 1 | deepak | abc,xyz,efd |
| 2 | raja | def,aye |
内容的提问来源于stack exchange,提问作者Deepak Gudawalekar
相关产品推荐
相关产品推荐

