SQL Server 2012中临时表结合FOR XML PATH按项目合并人员串异常排查
SQL Server 2012按项目分组合并人员字符串的解决方案
问题场景
使用SQL Server 2012,需将临时表#Team中同一项目(WBS1字段)的人员(Team字段)合并为逗号分隔的字符串,但当前SQL语句返回所有项目的人员列表均为全部人员,无法实现按项目分组展示的需求。
原错误SQL语句
select #Team.WBS1, stuff(( Select ',', #Team.Team as [text()] from #Team Where #team.WBS1 = #team.wbs1 for xml path('') ), 1, 1, '') from #Team
当前错误结果
| 项目 | 人员 |
|---|---|
| 1 | john, jim, sean, billy |
| 1 | john, jim, sean, billy |
| ... | ... |
所有项目行均显示全部人员集合。
期望结果
| 项目 | 人员 |
|---|---|
| 1 | john, jim, sean, billy |
| 2 | billy |
| 3 | jim, sean |
| 4 | john, jim, billy |
原始数据结构
| 项目 | 人员 |
|---|---|
| 1 | john |
| 1 | jim |
| ... | ... |
每个项目对应多条人员记录。
问题核心
子查询的WHERE条件未正确关联外层与内层临时表,#team.WBS1 = #team.wbs1是同一表的自相等判断,永远为真,导致子查询返回全部人员数据。
修正后的SQL语句
SELECT t1.WBS1, STUFF(( SELECT ',' + t2.Team FROM #Team t2 WHERE t2.WBS1 = t1.WBS1 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS 人员 FROM #Team t1 GROUP BY t1.WBS1;
关键说明
- 给内外层临时表分别取别名
t1和t2,通过t2.WBS1 = t1.WBS1实现外层项目与内层人员的精准关联,确保只合并当前项目的人员。 - 用
GROUP BY t1.WBS1对项目分组,避免同一项目出现多条重复结果。 - 使用
TYPE和.value('.', 'NVARCHAR(MAX)')处理特殊字符(如&、<等),避免XML自动转义问题,比直接拼接text()更可靠。
内容的提问来源于stack exchange,提问作者dave82
相关产品推荐
相关产品推荐

