В SQL Server до 2017 года это можно сделать с помощью коррелированного подзапроса FOR XML
.
SELECT [User].[name],
[User].[surname],
stuff((SELECT ',' + [Room].[number] [text()]
FROM [dbo].[Room]
INNER JOIN [dbo].[Permission]
ON [Permission].[room_id] = [Room].[ID]
WHERE [Permission].[user_id] = [User].[ID]
FOR XML PATH('')), 1, 1, NULL) [rooms]
FROM [dbo].[User];
С 2017 года существует функция агрегации string_agg()
, с которой можно объединять строки группы.
SELECT [User].[name],
[User].[surname],
string_agg([Room].[number], ',') [rooms]
FROM [dbo].[User]
INNER JOIN [dbo].[Permission]
ON [Permission].[user_id] = [User].[ID]
INNER JOIN [dbo].[Room]
ON [Room].[ID] = [Permission].[room_id]
GROUP BY [User].[ID],
[User].[name],
[User].[surname];
(Примечание: я добавил [User].[ID]
к GROUP BY
, так как может быть более одного пользователя с одинаковым именем.)