交叉表的WHERE条件

时间:2015-10-16 08:46:31

标签: sql

假设我有以下交叉表MemberClub:

MemberID | ClubId
1        | 2
2        | 1
2        | 2
2        | 3

我希望得到ID为 2的俱乐部中的所有成员。所以结果应该是ID为2的成员。

我的where语句怎么样?我尝试了不同的变化,但我不确定选择哪一种。

预期输出应为:

MemberID | ClubId
2        | 1
2        | 2

我需要一个灵活的版本,适用于灵活数量的俱乐部(可能是我希望所有成员都在俱乐部中只有ID 1.或者所有成员都在俱乐部,ID为2, 6)。

1 个答案:

答案 0 :(得分:1)

具有GROUP BY解决方案的常规HAVING COUNT(DISTINCT)

select MemberID
from MemberClub
WHERE ClubId IN (1,2)
GROUP BY MemberID
HAVING COUNT(DISTINCT ClubId) = 2

即。确保用户有两个不同的ClubId

或者,确保用户有不​​同的ClubId(仅适用于两个俱乐部案例):

select MemberID
from MemberClub
WHERE ClubId IN (1,2)
GROUP BY MemberID
HAVING max(ClubId) <> min(ClubId)

或者跳过GROUP BY,改为自我JOIN

select distinct m1.MemberID
from MemberClub m1
    join MemberClub m2 on m1.MemberID = m2.MemberID
where m1.ClubId = 1
  and m2.ClubId = 2

返回所有俱乐部的成员:

select MemberID
from MemberClub
GROUP BY MemberID
HAVING COUNT(DISTINCT ClubId) = (select count(distinct ClubId) from MemberClub)