如何编写“GROUP BY”查询以获取为给定应用程序分配给用户的所有角色

问题描述 投票:0回答:2

我有两个表User和User_Roles。用户可以拥有多个角色。

用户表

User_Id  User_Name
1        Edward  
2        John 
3        Mark  

USER_ROLES TABLE

User_ID    Role
1          Admin
1          Writer
1          Form
2          Writer
3          Form
3          Writer

我想写一个查询,给我以下结果

User_ID    User_Name   Role
1          Edward      Admin, Writer,Form
2          John        Writer
3          Mark        Form,Writer

我尝试过使用GROUP BY,我知道这是我可以得到的结果,但我只是做得不对。

SELECT COUNT(T0.[User_Id]),T0.[User_Name],T1.[Role]      
FROM  USER T0  
INNER JOIN  USER_ROLES T1 ON T0.User_ID = T1.User_ID  
GROUP BY  T0.[User_Name], T1.[Role]

我使用COUNT仅用于测试目的,因为当我使用聚合函数执行GROUP BY时,我收到错误。

sql sql-server
2个回答
1
投票

使用聚合和STRING_AGG()(可从SQL Server 2017开始):

SELECT u.User_ID, u.User_Name, STRING_AGG(r.Role, ',') AS Roles
FROM  user u  
INNER JOIN  user_roles r ON r.User_Id = u.User_Id
GROUP BY u.User_ID, u.User_Name

注意:您可能希望对聚合字符串进行排序,以便获得可预测的值,例如:

STRING_AGG(r.Role, ',') WITHIN GROUP (ORDER BY r.Role) AS Roles

0
投票

另一种选择是FOR XML XML / STUFF技巧:

  SELECT 
   U.USER_NAME,
   STUFF((SELECT ',' + UR.ROLE 
          FROM [USER_ROLES] UR
          WHERE UR.USER_ID = U.USER_ID
          FOR XML PATH('')), 1, 1, '') [ROLES]
FROM [USER] U
GROUP BY U.USER_NAME, U.USER_ID
ORDER BY 1

enter image description here

https://rextester.com/YLIJQ30828

© www.soinside.com 2019 - 2024. All rights reserved.