2010-05-09 25 views
2

我有三個表,我需要連接在一起並獲得結果的組合。我嘗試過使用左/右連接,但他們沒有給出想要的結果。如何擁有多個連接的多個表

例如:

表1 - 職工

id  name 
1  John 
2  Fred 

表2 - STAFFMOBILERIGHTS

id  staffid  mobilerightsid  rights 
--this table is empty-- 

表3 - MOBILERIGHTS

id  rightname 
1  Login 
2  View 

和我需要的是這作爲第四Ë結果...

id name id staffid mobilerightsid rights id rightname 
1 John null null null  null 1 login 
1 John null null null  null 2 View 
2 Fred null null null  null 1 login 
2 Fred null null null  null 2 View 

我曾嘗試以下:

SELECT * 
    FROM STAFFMOBILERIGHTS SMR 
    RIGHT JOIN STAFF STA 
    ON STA.STAFFID = SMR.STAFFID 
    RIGHT JOIN MOBILERIGHTS MRI 
    ON MRI.ID = SMR.MOBILERIGHTSID 

但這僅返回兩行,如下:

id  name id staffid mobilerightsid rights id rightname 
null null null null null  null 1 login 
null null null null null  null 2 View 

能什麼,我試圖實現完成如果是的話如何?

感謝

回答

1

從您的評論其現在很清楚你想要一個cross join(包括工作人員和mobilerights所有行)。像這樣的東西FROM子句指定,我們將包括從員工表中的所有行,並從MobileRights表中的所有行應該這樣做

SELECT 
* 
FROM Staff, MobileRights 
LEFT OUTER JOIN StaffMobileRights ON StaffMobileRights.StaffId = Staff.Id 

的。因此最終結果將包含(staff * MobileRights)行。

要從StaffMobileRights中引入行,我們還需要對該表進行連接。我們使用一個LEFT OUTER連接來確保我們總是包含左側(職員表中的行),但是如果右側沒有行(StaffMobileRights表),我們不會太困擾。如果連接不存在行,則返回空值。

+0

是STAFFMOBILERIGHTS有效地使人員和MOBILERIGHTS之間的許多一對多的關係,但只會有一個排STAFFMOBILERIGHTS如果權已被授予。目前沒有授予權利,因此沒有排隊STAFFMOBILERIGHTS。 運行您的SQL將返回零行。 – williamsdb 2010-05-09 10:30:43

+0

@williamsdb。啊,對不起, - 你現在要做的更清楚。看我的編輯。 – PaulG 2010-05-09 10:48:08

+0

賓果! 非常感謝,非常完美。現在我要看看我能否理解你所做的。 感謝您的幫助。 Neil – williamsdb 2010-05-09 11:08:12

0

你可能要問的是看null在哪裏沒有權利。在矩形風格,結果總是返回,這是一個簡單的來代表它加入的唯一途徑:

從PaulG的查詢我改變了一點總是把一切形成STAFF表。

SELECT 
* 
FROM STAFF 
RIGHT OUTER JOIN StaffMobileRights ON StaffMobileRights.StaffId = Staff.Id 
INNER JOIN MobileRights ON MobileRights.Id = StaffMobileRights.MobileRightsId