如何使用stuff()列出每个应用程序的用户角色?

时间:2018-09-24 16:25:40

标签: sql sql-server tsql

请考虑下表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

如何在每个应用程序中获取不同的行?

2 个答案:

答案 0 :(得分:2)

在外部选择之前使用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

答案 1 :(得分:1)

如果您希望结果中包含四列,我认为您需要这样的内容:

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;
相关问题