特定过滤多对多关系

时间:2016-12-08 22:20:49

标签: sql oracle

我试图在表示多对多关系的三个表上构建查询:

  • 用户
  • user_groups

我需要查询属于已定义的组数组成员的用户,但如果他们是任何其他组的成员,则不要将其包含在结果中。

所以我希望用户只能在" groupA"," groupD"和" groupZ"但如果他们是" groupB"然后不要在查询结果中返回它们。

我知道这一部分:

SELECT user.name
FROM user
JOIN user_groups on user_groups.user_id = user.id
JOIN groups on user_groups.group_id = group.id

但我不知道如何编写查询以返回我想要的确切结果。我应该提一下,如果重要的话,目标数据库是一个oracle数据库。

3 个答案:

答案 0 :(得分:0)

假设groups.name是标识该组的列。

SELECT user.name
FROM user
JOIN user_groups on user_groups.user_id = user.id
JOIN groups on user_groups.group_id = group.id
WHERE groups.name in ("GroupA", "GroupD", "GroupZ")

答案 1 :(得分:0)

使用having中的过滤器检查特定群组中的用户是否存在。

SELECT user.name
FROM user
JOIN user_groups on user_groups.user_id = user.id
JOIN groups on user_groups.group_id = group.id
GROUP BY user.name
HAVING COUNT(CASE WHEN user_groups.group_id='groupB' THEN user_groups.group_id END) = 0
AND COUNT(DISTINCT CASE WHEN user_groups.group_id IN ('groupA','groupD','groupZ') THEN user_groups.group_id END) = 3

答案 2 :(得分:0)

它相当难看,但我会和,,,,

一起去
SELECT *
FROM user
WHERE id IN (
  SELECT user_id
  FROM user_groups
  GROUP BY user_id
  HAVING 
   3=SUM (DECODE(group_id, 'GroupA', 1, 'GroupB', 1, 'GroupC', 1, 0))
  AND
   0=SUM (DECODE(group_id, 'GroupA', 0, 'GroupB', 0, 'GroupC', 0, 1))
  )