2012-09-24 43 views
0

我試圖加入/ UNION /基於第三個映射它們在一起的兩個表中的任何數據。這裏的想法是:關聯Oracle中兩個表的數據使用第三個將它們映射到一起

表USERS包含用戶ID,用戶名和其他一些數據。 表組包含組ID,組名和其他一些數據。

表USERGROUPMAP包含一組映射在一起的用戶ID和組ID,它們對應於USERS和GROUPS中的ID。每個用戶可以在多個組中,每個組可以有多個用戶。

我總是通過將對象或CSV數據存儲在單個字段中來完成此操作,例如,在組中創建一個名爲MEMBERS的列並存儲id1,id2,id3 ...但這就是我提出的。

我不能改變模式...我知道這與JOIN或UNIONs有關,但是我的SQL非常生鏽,所以任何人都可以在這裏幫忙嗎?

我也許半正確的思想 -

SELECT USERS.uid, 
     GROUPS.gid, 
     USERGROUPMAP.uid, 
     USERGROUPMAP.gid 
    FROM USERS, 
     GROUPS, 
     USERGROUPMAP 
    JOIN ON ((USERS.uid = USERGROUPMAP.uid) AND (GROUPS.gid = USERGROUPMAP.gid)) 

任何提示嗎? :(..謝謝你們。

編輯,預計IO

USERS表包含了一堆的UID ...... 1,2,3,4,5,等等 組表包含了一堆的GID,1000,1001,1002等

USERGROUPMAP包含對應元組到哪些用戶是其中基團,例如(1,1002)(2,1000)(5,1003)(5,1000)

我想獲得一個用戶組的列表,所以對於這個例子我想得到兩行5,1003和5,1000 ......有意義嗎?

+0

我理解你的表格和結構,但我不知道你在找什麼類型的輸出在這裏。你能提供一個場景和預期的結果嗎? –

+0

是的,一秒鐘,將編輯帖子 – mszaro

回答

1
Select a.userID, a.name, b.groupName 
from USERS a, GROUPS b, USERGROUPMAP c 
where c.userID = a.userID and 
b.groupID = c.groupID and 
c.userID = <searchID> 

要搜索的用戶標識是查詢中的搜索標識。如果列出組的用戶,則可以使用groupID替換userID。

+0

我實際上是在這樣的印象,像這樣的隱式加入這樣真的很慢...或者至少曾經是(我的最後一次oracle預測是... 8?)這是否合理快速? – mszaro

+0

有了多個表格,你無法避免它。這是最快的方法。您可以嘗試運行各種類型的查詢,但除非您的表格真的很大,否則您不會看到任何明顯的差異。 –

+0

除非您使用的是Oracle的真正舊版本,否則這兩種樣式應具有相同的性能。 – GuiGi

1

假設有用戶的,也沒有組沒有重複,這是一個簡單的加入三個表之間:

SELECT 
    USERS.FIELD1, 
    USERS.FIELD2, 
    -- ... 
    USERS.FIELDN, 
    GROUPS.FIELD1, 
    GROUPS.FIELD2, 
    -- ... 
    GROUPS.FIELDN 
FROM USERS 
JOIN USERGROUPMAP ON USERS.UID = USERGROUPMAP.UID 
JOIN GROUPS ON USERGROUPMAP.GID = GROUPS.GID 
+0

這也是正確的我猜,雖然我不能接受多個答案。 :( – mszaro

相關問題