Как использовать stuff () для перечисления пользовательских ролей для каждого приложения? - PullRequest
0 голосов
/ 24 сентября 2018

Рассмотрим следующую таблицу users

application  user_id    user_role     role_permissions
-------------------------------------------------------
1            20          A             add
1            20          B             edit
1            30          A             add
1            20          B             edit
1            30          V             delete
1            20          G             duplicate
1            40          X             purge
2            20          W             hide
2            20          P             unhide
2            40          X             purge

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

application  user_id    roles       permissions
-----------------------------------------------
1            20         A;B;G       add;edit;duplicate
1            30         A;V         add;delete
1            40         X           purge
2            20         W;P         hide;unhide
2            40         X           purge

Я пытался сделать это, используя stuff, но у меня ничего не вышло:

select users.user_id,
       stuff
       ((
           select ';' + user_role from users a
           where  a.user_id = b.user_id
           for xml path('')),1,1,'' 
       ) as roles
 from users b

Это дает мне:

user_id  permissions
-----------------------
20       A;B;B;G
20       A;B;B;G
20       A;B;B;G
30       A;V
30       A;V
...
etc

Как я могу получить отдельные строки в приложении PER?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Если вам нужны четыре столбца в ваших результатах, я думаю, вам нужно что-то вроде этого:

select
    u.application,
    u.user_id,
    stuff( (select distinct';' + user_role
           from users u2
           where  u.user_id = u2.user_id
           and u.application = u3.application
           for xml path('')
          ), 1, 1, '' 
        ) as roles
    stuff( (select distinct';' + role_permissions
           from users u3
           where  u.user_id = u3.user_id
           and u.application = u3.application
           for xml path('')
          ), 1, 1, '' 
        ) as permissions
from (select distinct application, user_id from users u) u;
0 голосов
/ 24 сентября 2018

Используйте distinct перед внешним выбором:

select u.user_id,
       stuff( (select distinct';' + user_role
               from users u2
               where u.user_id = u2.user_id and u.application = u2.application
               for xml path('')
              ), 1, 1, '' 
            ) as roles
from (select distinct user_id, application from users u) u;

Я не знаю, что такое obj_id.Очевидное условие корреляции использует user_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...