2016-12-08 109 views
0

我試圖建構上表示許多一對多的關係,三個表的查詢:一個很多的具體的過濾一對多的關係

  • 用戶
  • 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數據庫,如果這很重要的話。

回答

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") 
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 
+0

我去閱讀不同的需求 - 用戶必須在一個,兩個或三個組A,d和Z(不一定全部三個)。當然,這簡化了查詢。 – mathguy

+0

@mathguy ..你可能是對的..我在等待op的澄清,因爲這個問題並不完全清楚。 –

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)) 
)