我试图在表示多对多关系的三个表上构建查询:
我需要查询属于已定义的组数组成员的用户,但如果他们是任何其他组的成员,则不要将其包含在结果中。
所以我希望用户只能在" 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数据库。
答案 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))
)