我有一张叫做GroupMember的桌子。
GroupName MemberId
----------------------
A 101
A 102
B 106
C 110
C 101
我正在尝试编写一个存储过程来检索多个组的成员。应用程序用户可以选择多个GroupNames和运算符(AND-OR)。
OR运算符的我只是将GroupNames传递给存储过程并加入两个:
Create procedure JoinIntersect(@GroupNames userDefinedTableType1 readonly)
as
select distinct gm.MemberId
from GroupMember gm
inner join @GroupNames selectedGroups
on (gm.GroupName = selectedGroups.Name)
在这种情况下,如果我将A,C作为选定的组传递,结果将为:
MemberId
--------
101
102
110
如何实现AND运算符?是A AND C成员的用户?
答案 0 :(得分:2)
您可以重复使用相同的查询,但添加HAVING
子句:
select gm.MemberId
from GroupMember gm
inner join @GroupNames selectedGroups on (gm.GroupName = selectedGroups.Name)
group by gm.MemberId
having count(*) = (select count(distinct Name) from @GroupNames)
通俗地说,这会检查成员所属的组数是否与请求的组数相同。也就是说,如果您要求A组和C组中的成员,它将选择A和C的所有成员,然后选择具有两个(即两者)成员资格的成员。