Как написать запрос «GROUP BY», чтобы получить все роли, назначенные пользователю для данного приложения - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть две таблицы Пользователь и Пользователь_Roles .Пользователь может иметь несколько ролей.

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ

User_Id  User_Name
1        Edward  
2        John 
3        Mark  

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ

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 с агрегатной функцией, я получаю ошибку.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Использовать агрегирование и 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

NB. Возможно, вы захотите упорядочить агрегированные строки, чтобы получить предсказуемые значения, например:

STRING_AGG(r.Role, ',') WITHIN GROUP (ORDER BY r.Role) AS Roles
0 голосов
/ 06 апреля 2019

Альтернатива для нас - трюк FOR 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...