Как объединить строки в SQL-запросе с двумя внутренними объединениями? - PullRequest
1 голос
/ 18 июня 2019

В моем SQL Server 2014 у меня есть 3 таблицы. В одной таблице - информация о пользователях, в другой - информация о группах, а в третьей - зависимости пользователей и групп.

Я только что настроил свой запрос, но результат не тот, каким я хочу быть. Как и мой недавний вопрос Объединение строк в SQL-запросе Я хочу попытаться получить аналогичный результат

Result from my query

Вот запрос с моего сервера:

SELECT server01.customer05.user.id, server01.customer05.user.namename, server01.customer05.groups.name FROM server01.customer05.username

INNER JOIN customer05.bgrel ON server01.customer05.id=server01.customer05.bgrel.username_id
INNER JOIN customer05.groups ON customer05.groups.id=customer05.bgrel.groups_id

WHERE server01.customer05.username != 'ANONYMOUS' and server01.customer05.username != 'INST_ROOT' and server01.customer05.username != 'SERVER_ROOT_3'

ORDER BY username

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вы можете сгруппировать таблицу по ID и user, а затем использовать функцию STUFF, чтобы получить group в качестве значений, разделенных запятыми

сначала давайте создадим тестовую таблицу, которая соответствует образцу данных из вашего вопроса.

declare @t table (ID int, [user] varchar(10), [group] varchar(10))
insert into @t (ID, [user], [group])
values (1, 'max', 'g1'),
       (1, 'max', 'admin'),
       (2, 'tom', 'g2'),
       (3, 'jan', 'g1'),
       (3, 'jan', 'k1'),
       (3, 'jan', 'o1')

теперь мы можем запрашивать различные идентификаторы и пользователей, как это

select t.ID,
       t.[user]
from   @t t
group by t.ID, t.[user]

и это даст нам

ID  user    
1   max     
2   Tom     
3   Jan     

Теперь все, что нам нужно, это получить группу в виде значения, разделенного запятыми, для каждой строки, и это мы можем сделать с помощью функции stuff.

select t.ID,
       t.[user],
       stuff( (select ',' + t2.[group] from @t t2 where t2.ID = t.ID for XML path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') as [group]  
from   @t t
group by t.ID, t.[user]

результат будет

ID  user    group
1   max     Admin,g1
2   Tom     g2
3   Jan     g1,K1,O1

Глядя на ваш запрос, я думаю, вы можете реализовать его следующим образом. Я не могу не проверить это, конечно, потому что у меня нет вашей базы данных.

select t.ID,
       t.[user],
       stuff( (select ',' + t2.[group] from @t t2 where t2.ID = t.ID for XML path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') as [group]  
from   ( SELECT server01.customer05.user.id, 
                server01.customer05.user.namename as [user], 
                server01.customer05.groups.name as [group] 
         FROM   server01.customer05.username
           INNER JOIN customer05.bgrel ON server01.customer05.id=server01.customer05.bgrel.username_id
           INNER JOIN customer05.groups ON customer05.groups.id=customer05.bgrel.groups_id
         WHERE  server01.customer05.username != 'ANONYMOUS' 
         and    server01.customer05.username != 'INST_ROOT' 
         and    server01.customer05.username != 'SERVER_ROOT_3'
       ) t  
group by t.ID, t.[user]
0 голосов
/ 18 июня 2019

Использование SQL Server Stuff-

WITH CTE (ID, [user],[ group])
AS
(
    SELECT 1,'max', 'g1' UNION ALL
    SELECT 1,'max', 'Admin' UNION ALL
    SELECT 2,'Tom', 'g2' UNION ALL
    SELECT 3,'Jan', 'g1' UNION ALL
    SELECT 3,'Jan', 'K1' UNION ALL
    SELECT 3,'Jan', 'O1'

    -- Above, you need to replace SELECT statements
    -- with your SELECT statement from which you are 
    -- Getting the first table output 
)
SELECT DISTINCT B.ID,B.[user],
STUFF((SELECT DISTINCT  ',' + A.[ group] FROM CTE A WHERE A.ID = B.ID FOR XML     PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') [Group]  
FROM CTE B

Выход -

ID  user    Group
1   max     Admin,g1
2   Tom     g2
3   Jan     g1,K1,O1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...