Запрос SQL Server с несколькими значениями в одном столбце, относящихся к другому столбцу - PullRequest
0 голосов
/ 29 ноября 2010

Ситуация: Эта таблица содержит информацию об отношениях между таблицей «Документы» и таблицей «Пользователи».Определенные пользователи должны просматривать или утверждать документы (тип).Я хотел бы, чтобы это было так, чтобы я мог собрать всех рецензентов в одной строке, если это необходимо.Таким образом, если три пользователя просматривают Документ 1, в строке будет 346, 394, 519 в качестве значения, поскольку это рецензенты

Таблица: xDocumentsUsers

DocID..UserID....Type...
1........386......approver
1........346......reviewer
1........394......reviewer..
1........519......reviewer..
4........408......reviewer..
5........408......reviewer..
6........408......reviewer..
7........386......approver..
7........111......readdone..
7........346......reviewer..
8........386......approver..
8........346......reviewer..
9........386......approver..
9........346......reviewer..
10.......386......approver..
11.......386......approver..
11......346......reviewer..
12......386......approver..
12......346......reviewer..
13......386......approver..
13......346......reviewer..
14......386......approver..
14......346......reviewer..
15......386......approver

Таким образом, желаемый результат будет ...

DocID..UserID ................ Тип ...

1........386....................approver
1........346,394,519......reviewer.
4........408....................reviewer..
5........408....................reviewer..
6........408....................reviewer..
7........386....................approver..
7........111....................readdone..
7........346....................reviewer..
8........386....................approver..
8........346....................reviewer..
9........386....................approver..
9........346....................reviewer..
10......386....................approver..
11......386....................approver..
11......346....................reviewer..
12......386....................approver..
12......346....................reviewer..
13......386....................approver..
13......346....................reviewer..
14......386....................approver..
14......346....................reviewer..
15......386....................approver

Ответы [ 3 ]

2 голосов
/ 10 октября 2012

FOR XML PATH - отличное решение. Однако вы должны знать, что он преобразует любые специальные символы во внутреннем результирующем наборе SELECT в их xml-эквивалент, т. Е. & Станет & в результирующем наборе XML. Вы можете легко вернуться к исходному символу, используя функцию REPLACE для внутреннего набора результатов. Чтобы позаимствовать предыдущий пример, он будет выглядеть так (обратите внимание, что SELECT в качестве 1-го аргумента функции REPLACE заключен в ():

--Concat
SELECT  t.ID,
    REPLACE((SELECT  tIn.Val + ','
        FROM    @Table tIn
        WHERE   tIn.ID = t.ID
        FOR XML PATH('')), '&', '&'))
FROM    @Table t
GROUP BY t.ID
1 голос
/ 29 ноября 2010

Посмотрите на

Эмуляция функции MySQL GROUP_CONCAT () в SQL Server 2005

Есть ли способ создать функцию SQL Server дляобъединить несколько строк из подзапроса в одно поле с разделителями?

Простой пример:

DECLARE @Table TABLE(
        ID INT,
        Val VARCHAR(50)
)
INSERT INTO @Table (ID,Val) SELECT 1, 'A'
INSERT INTO @Table (ID,Val) SELECT 1, 'B'
INSERT INTO @Table (ID,Val) SELECT 1, 'C'
INSERT INTO @Table (ID,Val) SELECT 2, 'B'
INSERT INTO @Table (ID,Val) SELECT 2, 'C'

--Concat
SELECT  t.ID,
        (
            SELECT  tIn.Val + ','
            FROM    @Table tIn
            WHERE   tIn.ID = t.ID
            FOR XML PATH('')
        )
FROM    @Table t
GROUP BY t.ID
0 голосов
/ 29 ноября 2010

Это помогает?

SELECT DocID
     , [Type]
     , (SELECT CAST(UserID + ', ' AS VARCHAR(MAX)) 
         FROM [xDocumentsUsers] 
         WHERE (UserID = x1.UserID) 
         FOR XML PATH ('')
      ) AS [UserIDs]
FROM [xDocumentsUsers] AS x1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...