在MSSQL中模拟group_concat,模糊列名?

时间:2013-12-16 05:42:42

标签: sql sql-server string-aggregation

我目前正在尝试将MySQL中的group_concat函数模拟为MSSQL。我遵循herehere中的代码格式。问题是,当我尝试执行查询时,我收到了Ambiguous column name列的消息RoleID。这是我的疑问:

select UserName, RoleID from tb_UserInRoles
cross apply(
    select RoleName from tb_Roles
    where tb_UserInRoles.RoleID = tb_Roles.RoleID
    for XML Path('')
) fxMerge (RoleID) group by UserName, RoleID

我想知道为什么这种特殊的代码格式会出现Ambiguous column name错误消息。我需要让这个查询工作并理解它。在此先感谢您的帮助。

我打算在多对多关系表中使用它,其中系统的用户可以有多个角色,如下所示:

|  User  |   Role  |
|--------|---------|
| JamesP |  Maker  |
| JamesP | Approver|
| JamesP |  Admin  |

我希望结果查询如下:

|  User  |           Role           |
|--------|--------------------------|
| JamesP |  Maker, Approver, Admin  |

1 个答案:

答案 0 :(得分:6)

试试这个:

SELECT UIR.UserName, MAX(STUFF(fxMerge.RoleID, 1, 1, '')) 
FROM tb_UserInRoles UIR
CROSS APPLY(
    SELECT ',' + RoleName 
    FROM tb_UserInRoles UIR1 
    INNER JOIN tb_Roles RM ON UIR1.RoleID = RM.RoleID
    WHERE UIR.UserName = UIR1.UserName 
    FOR XML PATH('')
) fxMerge (RoleID) 
GROUP BY UIR.UserName