MSSQL如何将同一员工的多个角色拼接为逗号分隔的字符串输出
方案1:SQL Server 2017 及以上版本(推荐)
直接使用内置的STRING_AGG聚合函数实现字符串拼接,修改后的查询语句如下:
SELECT E.ID, E.Name AS 姓名, STRING_AGG(R.Role, ', ') AS 所有角色 FROM EMPLOYEE_ROLE ER JOIN ROLE R ON R.ID = ER.RoleID JOIN EMPLOYEE E ON ER.EmployeeID = E.ID GROUP BY E.ID, E.Name
STRING_AGG第一个参数是要拼接的字段,第二个参数是拼接的分隔符,配合GROUP BY按人员ID和姓名分组,即可将同一人员的所有角色拼接为单个字符串,和你要求的输出格式完全匹配。
方案2:SQL Server 2016 及更早版本
旧版本没有STRING_AGG函数,可通过FOR XML PATH语法实现同样效果:
SELECT E.ID, E.Name AS 姓名, STUFF(( SELECT ', ' + R2.Role FROM EMPLOYEE_ROLE ER2 JOIN ROLE R2 ON R2.ID = ER2.RoleID WHERE ER2.EmployeeID = E.ID FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS 所有角色 FROM EMPLOYEE E GROUP BY E.ID, E.Name
STUFF函数的作用是删除拼接结果开头多余的,(两个字符),最终输出的格式和方案1完全一致。
两种方案运行后都会得到你预期的结果:
| ID | 姓名 | 所有角色 |
|---|---|---|
| 00001 | Bob | Role abc, Role def, Role ghi |
| 00002 | Tom | Role jkl |
内容的提问来源于stack exchange,提问作者JS16
相关产品推荐
相关产品推荐

