如何在T-SQL中按ID合并多表内连接后的用户角色数据
在MS SQL中将同一账户的关联角色合并为单行显示
针对你的场景,MS SQL提供了两种常用方法来实现角色的合并,根据你的SQL Server版本选择即可:
方法1:使用STRING_AGG(SQL Server 2017及以上版本推荐)
这是最简洁的实现方式,直接通过内置聚合函数完成字符串拼接:
SELECT a.name AS Name, STRING_AGG(us.name, ',') AS Role FROM administration$account a INNER JOIN system$userroles uss ON a.id = uss.system$userid INNER JOIN system$userrole us ON us.id = uss.system$userroleid GROUP BY a.id, a.name
说明:
STRING_AGG(us.name, ','):将当前分组(同一账户)下的所有角色名,用逗号作为分隔符拼接成单个字符串GROUP BY a.id, a.name:按账户主键a.id和用户名a.name分组,确保同一账户的所有角色被合并到一行(用主键分组避免同名账户的干扰)
方法2:兼容低版本SQL Server(2016及更早)
如果你的SQL Server版本不支持STRING_AGG,可以使用STUFF + FOR XML PATH的组合写法:
SELECT DISTINCT a.name AS Name, STUFF( (SELECT ',' + us2.name FROM system$userroles uss2 INNER JOIN system$userrole us2 ON us2.id = uss2.system$userroleid WHERE uss2.system$userid = a.id FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS Role FROM administration$account a INNER JOIN system$userroles uss ON a.id = uss.system$userid
说明:
- 子查询通过
FOR XML PATH('')将角色名拼接成带前置逗号的字符串(例如,LocationManager,PlacementManager) STUFF函数用于移除字符串开头的多余逗号,得到干净的拼接结果- 加上
DISTINCT避免因关联表导致的重复行
执行结果
两种方法都会输出你期望的格式:
Role Name LocationManager,PlacementManager Britt
内容的提问来源于stack exchange,提问作者user3394645
相关产品推荐
相关产品推荐

