TSQL连接和交集

时间:2014-05-01 00:57:14

标签: sql sql-server tsql

我有一张叫做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成员的用户?

1 个答案:

答案 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)

SQL Fiddle demo

通俗地说,这会检查成员所属的组数是否与请求的组数相同。也就是说,如果您要求A组和C组中的成员,它将选择A和C的所有成员,然后选择具有两个(即两者)成员资格的成员。