До выпуска SQL Server 2017 (для которого предусмотрена агрегатная функция STRING_AGG ) необходимо использовать знаменитый коррелированный подзапрос FOR XML PATH
:
SetUp:
DECLARE @Notes TABLE (ID INT, Name VARCHAR(10))
INSERT INTO @Notes (ID, Name)
VALUES (2, 'Test'), (3, 'Test')
DECLARE @EditorAssignment TABLE (UserID INT, NoteID INT)
INSERT INTO @EditorAssignment (UserID, NoteID)
VALUES (1, 2), (2, 2),
(3, 3) -- Added missing row here
DECLARE @UserList TABLE (ID INT, username VARCHAR(100))
INSERT INTO @UserList (ID, username)
VALUES (1, 'testuser'), (2, 'bUser'), (3, 'cUser')
Запрос:
SELECT
NoteID = N.ID,
[User] = STUFF(
(
SELECT
', ' + U.username
FROM
@EditorAssignment AS E
INNER JOIN @UserList AS U ON E.UserID = U.ID
WHERE
N.ID = E.NoteID -- Link the outmost Notes' note with the inner EditorAssignment (correlated subquery)
FOR XML
PATH ('') -- FOR XML PATH('') makes the SELECT return a string value, not a result set
),
1,
2,
'')
FROM
@Notes AS N
Результаты:
NoteID User
2 testuser, bUser
3 cUser
Подзапрос генерирует строку с каждым именем пользователя для соответствующего назначения для каждой заметки.
The STUFF
Функция используется только для замены первого ', '
, поскольку строка строится с запятой и пробелом.Вот почему параметры STUFF : 1 (первая позиция строки), 2 (количество мест для удаления, запятая и пробел) и ''
(замена этих символов).
Я предполагаю, что у вас отсутствует строка для таблицы EditorAssignment
, которая содержит значения 3, 3
в вашем примере.