我有两个表:USERS(IDUser,UserDesc)和ROLES(IDRole,RoleDesc),其中m:n关系存储在关联表RolePerUser(IDUser,IDRole)中。
我想将这些角色分组到一个更易于管理的PROFILE中,我需要一种方法来发现哪些角色可以组成一个PROFILE,并以重复频率为基础进行分析。
例如:
USER1 has (Role 1, Role 3, Role 4, Role 5, Role 6)
USER2 has (Role 1, Role 4, Role 5, Role 6, Role 7)
USER3 has (Role 1, Role 4, Role 5, Role 7, Role 8)
在修复表示PROFILE中ROLES数量的参数(n)之后,我想编写一个可以证明符合条件的关系的SQL查询
有没有办法(统计公式或其他技巧)来完成这项任务?数据集非常大(576个角色对11.069个用户,平均每个用户有20个角色)
提前谢谢
保
编辑:我正在使用MSSQL 2008 R2
答案 0 :(得分:0)
如果您有一个设定的号码,那么您可以使用聚合来获得您想要的。查询的结构是:
select ru1.idrole, ru2.idrole, ru3.idrole, ru4.idrole, count(*)
from RolePerUser ru1 join
RolePerUser ru2
on ru1.iduser = ru2.iduser and ru1.idrole < ru2.idrole join
RolePerUser ru3
on ru2.iduser = ru3.iduser and ru2.idrole < ru3.idrole join
RolePerUser ru3
on ru3.iduser = ru4.iduser and ru3.idrole < ru4.idrole
group by ru1.idrole, ru2.idrole, ru3.idrole, ru4.idrole
order by count(*) desc;
这是标准的SQL,它应该适用于所有数据库。
对于性能,您需要RolePerUser(iduser, idrole)
上的索引。然后尝试对两个角色,三个角色等进行查询,以查看性能是否可接受。