选择具有n个角色的用户来报告函数SQL

时间:2017-01-31 16:42:14

标签: sql sql-server

我有一个使用标准Role,User和UserRoleJoin架构的应用程序。

应用程序需要根据用户所处的角色组向用户发送报告。例如

角色

ID Name
1  Lead
2  Mech
3  Elec
4  Auditor
5  Assigner

的UserRole

UserID RoleID
1       1
1       2
1       4
2       1
2       4

我希望能够向所有潜在客户,机甲和审核员用户发送一份报告,或者向所有潜在客户和审核员用户发送不同的报告。

第一份报告只会发送给用户1,而第二份报告会发送给用户2

我是否应该使用不同的表来处理报告关联的角色,还是应该通过选择查询处理这些组?

2 个答案:

答案 0 :(得分:1)

有几种方法。我倾向于使用group byhaving

select ur.UserId
from UserRole ur join
     Role r
     on ur.RoleID = r.Id
where name in ('Leads', 'Mech', 'Auditors')
group by ur.UserId
having count(*) = 3;

这种方法的优点是逻辑全部在having子句中。您可以使其更加灵活,例如所有非审计员的潜在客户和机会。

答案 1 :(得分:1)

如果这些群体足够稳定,他们应该有办法将其保留在数据库中,Group(ID PK, Name)RoleGroup(GroupID , RoleID)

declare @grpName varchar(50) = 'my_group';

select ur.UserId
from UserRole ur 
join RoleGroup rg on rg.RoleID = ur.RoleID 
join Group g on rg.GroupID = g.ID and g.Name = @grpName
group by ur.UserId
having count(*) = (select count(*) n 
                   from RoleGroup rg  
                   join Group g on rg.GroupId = g.ID and g.Name = @grpName);