【问题标题】:emulate group_concat in MSSQL, ambiguous column name?在 MSSQL 中模拟 group_concat,列名不明确?
【发布时间】:2013-12-16 05:42:42
【问题描述】:

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

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  |

【问题讨论】:

    标签: sql sql-server string-aggregation


    【解决方案1】:

    试试这个:

    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
    

    【讨论】:

    • @JamesP 检查我更新的答案。它将解决您的问题。我加入了USERNAME 列,因为我不知道表结构。所以如果你有的话,你必须加入USERID 专栏。查询的变化是 WHERE UIR.UserId = UIR1.UserId 而不是 UIR.UserName = UIR1.UserName
    • 它现在工作得很好 :) 如果您不介意,我想知道代码中的哪个功能,例如,您为什么使用 MAX 和 STUFF,为什么使用 INNER JOIN 等。
    • @JamesP 子查询返回特定用户的所有角色名称,因此我必须加入两个表。子查询为 JampesP 用户返回 ,Maker,Approver,Admin。所以我需要 ro 删除第一个命令。所以我使用 STUFF 函数来实现这个
    • @JamesP 内部查询不是子查询。
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2014-05-03
    • 2018-01-21
    • 2020-11-28
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多