Объединить несколько результатов в один столбец - PullRequest
0 голосов
/ 07 февраля 2019

Я хотел бы создать оператор выбора, чтобы объединить несколько результатов в одну гниль

Мне удалось реализовать то, что я хочу, с помощью PHP, но я думаю, что должна быть возможность работать напрямую с Sql.

Notes
| ID | Name |
|----|------|
| 2  | Test |
| 3  | Test |

EditorAssignment
| UserID | NoteID |
|--------|--------|
| 1      | 2      |
| 2      | 2      |

UserList
| ID | username |
|----|----------|
| 1  | testuser |
| 2  | bUser    |
| 3  | cUser    |

Мне бы хотелось получить следующий результат:

| NoteID | User            |
|--------|-----------------|
| 2      | testuser, bUser |
| 3      | cUser           |

Как мне создать подобный выбор в SQL2012?

1 Ответ

0 голосов
/ 07 февраля 2019

До выпуска 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 в вашем примере.

...