【问题标题】:TSQL join and intersectionSQL 连接和交集
【发布时间】:2014-05-01 00:57:13
【问题描述】:

我有一个名为 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 成员的用户?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以重复使用相同的查询,但添加 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 的所有成员,然后选择具有两个(即两个)成员资格的成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      相关资源
      最近更新 更多