如何生成SQL查询以获取属于几个组而不属于其他组的用户列表

如何生成SQL查询以获取属于几个组而不属于其他组的用户列表,sql,Sql,假设我们有一张这样的桌子 UserID | GroupID u1 | G1 u2 | G1 u3 | G2 u1 | G2 u1 | G4 u1 | G3 如何生成SQL查询以验证->用户“U1”是否在G1和G2中,但不在G4中” 这个逻辑可以是动态的。如果用户“U1”在G2而不是G3,那么->也可以是动态的 所以基本上我需要验证“logic”是否返回true或false,因为“logic”是这样记录的: 如果用户在(@Gr='gr1'或@Gr='gr2')和@Gr'gr3'中,则返回用户。

假设我们有一张这样的桌子

UserID | GroupID
u1 | G1
u2 | G1
u3 | G2
u1 | G2
u1 | G4
u1 | G3
如何生成SQL查询以验证->用户“U1”是否在G1和G2中,但不在G4中” 这个逻辑可以是动态的。如果用户“U1”在G2而不是G3,那么->也可以是动态的

所以基本上我需要验证“logic”是否返回true或false,因为“logic”是这样记录的:

如果用户在
(@Gr='gr1'或@Gr='gr2')和@Gr'gr3'中,则返回用户。


希望我解释得对:)

希望,我正确理解了你的问题

请检查下面的查询,如果您定义了组的数量,则可以使用此查询, 根据需要改变where条件

e、 g.
验证->是否为用户“U1”在G1和G2中,但不在G4中

select * from
(
select UserID,
sum(case when GroupID = 'G1' then 1 else 0 end) g1_sum,
sum(case when GroupID = 'G2' then 1 else 0 end) g2_sum,
sum(case when GroupID = 'G3' then 1 else 0 end) g3_sum,
sum(case when GroupID = 'G4' then 1 else 0 end) g4_sum
from
table
group_by UserID
)
where UserID = 'u1' and g1_sum > 0 and g2_sum > 0 and g4_sum = 0

您编写的逻辑可以通过子查询来完成。 您需要IN子句这样做。 请注意,使用表别名(ug2 ug3)为每个子查询查询相同的表

SELECT ug1.UserID  
     , ug1.GroupID    
  FROM [UserGroupTable] ug1
 WHERE (ug1.UserID IN ( SELECT ug2.UserID      
                          FROM [UserGroupTable] ug2
                         WHERE ug2.GroupID IN ('G1','G2')
                      ) 
       )
   AND (ug1.UserID NOT IN ( SELECT ug3.UserID                           
                              FROM [UserGroupTable] ug3
                             WHERE ug3.GroupID IN ('G3') 
                          )
       )