2013-12-16 43 views
4

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

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 | 

回答

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 
+0

不起作用。结果仅为我的用户显示一个角色。 – JamesP

+0

@JamesP检查我更新的答案。它会解决你的问题。我加入了'USERNAME'列,因为我不知道表结构。所以你必须加入'USERID'列。在查询中的更改是WHERE'UIR.UserId = UIR1.UserId'而不是'UIR.UserName = UIR1.UserName' –

+0

它现在工作出色:)如果你不介意,我想知道哪些在做什么代码,比如,为什么使用MAX和STUFF,为什么要使用INNER JOIN等。 – JamesP