如何在SQL主视图中将多行用户数据合并为逗号分隔的单行?
合并服务关联用户为逗号分隔字符串的SQL实现
现有主表ServicesData,当前执行的查询语句为:
SELECT SrvID, SrvTitle, SrvStatus, '' AS SrvUsersText FROM ServicesData
需要将每个服务对应的所有关联用户合并为逗号分隔的字符串,填充到SrvUsersText字段中。以下是主流数据库的实现方案(假设子表名为ServiceUsers,关联字段为SrvID,用户名字段为UserName):
SQL Server 版本
使用STRING_AGG函数完成字符串聚合:
SELECT sd.SrvID, sd.SrvTitle, sd.SrvStatus, ISNULL(STRING_AGG(su.UserName, ', '), '') AS SrvUsersText FROM ServicesData sd LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
LEFT JOIN确保无关联用户的服务仍会被返回,ISNULL将聚合结果的NULL转为空字符串
MySQL 版本
使用GROUP_CONCAT函数:
SELECT sd.SrvID, sd.SrvTitle, sd.SrvStatus, IFNULL(GROUP_CONCAT(su.UserName SEPARATOR ', '), '') AS SrvUsersText FROM ServicesData sd LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
GROUP_CONCAT默认用逗号分隔,也可通过SEPARATOR指定自定义分隔符
Oracle 版本
使用LISTAGG函数:
SELECT sd.SrvID, sd.SrvTitle, sd.SrvStatus, NVL(LISTAGG(su.UserName, ', ') WITHIN GROUP (ORDER BY su.UserName), '') AS SrvUsersText FROM ServicesData sd LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
WITHIN GROUP (ORDER BY ...)可指定用户名字的排序顺序,按需调整
PostgreSQL 版本
使用STRING_AGG函数:
SELECT sd.SrvID, sd.SrvTitle, sd.SrvStatus, COALESCE(STRING_AGG(su.UserName, ', '), '') AS SrvUsersText FROM ServicesData sd LEFT JOIN ServiceUsers su ON sd.SrvID = su.SrvID GROUP BY sd.SrvID, sd.SrvTitle, sd.SrvStatus
COALESCE用于将无用户时的NULL结果转为空字符串
内容的提问来源于stack exchange,提问作者A.J
相关产品推荐
相关产品推荐

