如何在T-SQL中将同一UgovorId的多个Naziv合并为字符串显示?
合并同一UgovorId对应的多个Naziv为字符串的SQL解决方案
嘿,我明白你的需求了——你现在的查询能返回部分结果,但同一个vup.UgovorId对应多条p.Naziv记录,你想把这些Naziv合并成一个字符串,让每个UgovorId只显示一行对吧?这在SQL里用字符串聚合函数就能轻松实现,不同数据库的语法略有不同,我给你整理几种常见场景的写法:
MySQL/MariaDB
用GROUP_CONCAT函数来聚合字符串,还可以自定义分隔符(默认是逗号):
SELECT vup.UgovorId, GROUP_CONCAT(p.Naziv SEPARATOR ', ') AS 合并的Naziv FROM 你的vup表名 vup JOIN 你的p表名 p ON vup.关联字段 = p.关联字段 GROUP BY vup.UgovorId;
如果需要去重,还能加上DISTINCT:GROUP_CONCAT(DISTINCT p.Naziv SEPARATOR ', ')
SQL Server(2017及以上版本)
SQL Server 2017之后支持STRING_AGG函数,用法更简洁直观:
SELECT vup.UgovorId, STRING_AGG(p.Naziv, ', ') AS 合并的Naziv FROM 你的vup表名 vup JOIN 你的p表名 p ON vup.关联字段 = p.关联字段 GROUP BY vup.UgovorId;
要是想给聚合后的字符串排序,就用WITHIN GROUP:
STRING_AGG(p.Naziv, ', ') WITHIN GROUP (ORDER BY p.Naziv) AS 合并的Naziv
PostgreSQL
PostgreSQL同样支持STRING_AGG函数,用法和SQL Server基本一致:
SELECT vup.UgovorId, STRING_AGG(p.Naziv, ', ') AS 合并的Naziv FROM 你的vup表名 vup JOIN 你的p表名 p ON vup.关联字段 = p.关联字段 GROUP BY vup.UgovorId;
排序的话直接在函数后加ORDER BY:STRING_AGG(p.Naziv, ', ') ORDER BY p.Naziv
Oracle(11g R2及以上版本)
Oracle用LISTAGG函数,必须指定排序规则:
SELECT vup.UgovorId, LISTAGG(p.Naziv, ', ') WITHIN GROUP (ORDER BY p.Naziv) AS 合并的Naziv FROM 你的vup表名 vup JOIN 你的p表名 p ON vup.关联字段 = p.关联字段 GROUP BY vup.UgovorId;
小提醒
记得把示例里的你的vup表名、你的p表名和关联字段,替换成你实际的表名和关联逻辑(比如外键匹配的字段)。如果你的数据库版本比较旧,可能需要用自定义函数或者XML拼接这类替代方案,但上面的写法已经覆盖了绝大多数主流数据库的新版本。
内容的提问来源于stack exchange,提问作者user7512602
相关产品推荐
相关产品推荐

