You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:42:30