请考虑下表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
如何在每个应用程序中获取不同的行?
答案 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;