SQL Server低版本无STRING_AGG函数,求分组字符串拼接解决方案
解决SQL Server低版本无STRING_AGG时的分组拼接问题
问题原因
你提供的XML拼接代码出错的核心是子查询未与外层查询的studentid建立关联,导致子查询返回了表中所有code,最终拼接成全局的代码串,而非当前分组学生的对应code。
正确的基于XML实现代码
SELECT studentid, Codes = STUFF(( SELECT ',' + t2.code FROM dbo.testtable t2 WHERE t2.studentid = t1.studentid -- 关键:关联外层的studentid,限定当前学生的code FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM dbo.testtable t1 GROUP BY t1.studentid ORDER BY t1.studentid;
代码说明
- 给外层表和子查询表分别设置别名(
t1、t2),避免表名引用冲突。 - 子查询中通过
WHERE t2.studentid = t1.studentid,确保只拼接当前studentid对应的code。 STUFF函数用于移除拼接结果开头多余的逗号。FOR XML PATH('')将子查询结果拼接为XML字符串,TYPE参数保证特殊字符(如<、>)不会被转义,最后用.value('.', 'NVARCHAR(MAX)')提取纯文本内容。
可选写法(基于CROSS APPLY)
如果你的SQL Server版本支持CROSS APPLY,可以用以下逻辑更清晰的写法:
SELECT t1.studentid, Codes = STUFF(t2.CodesXml, 1, 1, '') FROM dbo.testtable t1 CROSS APPLY ( SELECT ',' + code FROM dbo.testtable t2 WHERE t2.studentid = t1.studentid FOR XML PATH(''), TYPE ) t2(CodesXml) GROUP BY t1.studentid, t2.CodesXml ORDER BY t1.studentid;
内容的提问来源于stack exchange,提问作者D B
相关产品推荐
相关产品推荐

