2009-09-28 53 views
1

我試圖從數據庫中獲取一些數據。 我想選擇一名員工,並且如果有的話,可以選擇與該員工相關的所有約會和其他數據。組合OUTER JOIN和WHERE

這是查詢:

SELECT 
TA.id, 
TEI.displayname, 
TA.threatment_id, 
TTS.appointment_date, 
     TEI.displayname 
    FROM 
tblemployee AS TE 
LEFT OUTER Join tblappointment AS TA ON TE.employeeid = TA.employee_id 
Inner Join tblthreatment AS T ON TA.threatment_id = T.threatmentid 
Inner Join tblappointments AS TTS ON TTS.id = TA.appointments_id AND 
      TTS.appointment_date = '2009-09-28' 
     INNER Join tblemployeeinfo AS TEI ON TEI.employeeinfoid = TE.employeeinfoid 
     Inner Join tblcustomercard AS TCC ON TCC.customercardid = TTS.customercard_id 
    WHERE 
    TE.employeeid = 4 

的問題是,它只是在沒有預約返回null選擇的所有字段。我不在這裏?

編輯: 對於clearity,我刪除了一些collumns的。我刪除了太多。至少應顯示TEI.displayname。在您的查詢返回的列清單

+1

如果您不期望爲零,您期望什麼? – Natrium 2009-09-28 13:25:36

+0

我應該更清楚。它顯示所有字段爲空(包括員工)。它至少應該給員工。 – Ikke 2009-09-28 13:49:10

回答

3

看,你會發現,他們都來自LEFT OUTER的「右」側JOIN。您不包含連接「左側」的任何列。因此,預期的結果就是您正在觀察的結果 - 爲返回沒有右手行的行的結果集中的所有右列提供NULL值。

要查看即使是那些行的數據,也要在結果集中包含來自TE(tblemployee)的一些列。

看着你的查詢我猜測情況有點複雜,連接右側的一些表應該移動到左側,而且,一些的其他表可能需要他們自己的OUTER連接才能正確參與查詢。

編輯瓦特/迴應提問的評論:

您有一個奇怪的情況(也許不是奇可言,這取決於你的應用程序)中,你有一個僱員表和一個獨立的員工信息(employeeinfo)表。

因爲你是用內側連接的employeeinfo到預約表連接,你可以有效地把它們看成一個單一的表,他們對最終的結果集如何促進條款。由於此組合表需要在約會表中記錄,並且由於此組合表使用LEFT OUTER聯合連接到主結果集,因此,如果沒有指定聯繫人的僱員信息,則不會找到employeeinfo記錄。

如果將employeeinfo表的加入,或更換職員表瓦特/ employeeinfo表的左側,你應該得到你想要的結果。

+0

謝謝。在預約表解決問題後,外部加入所有表格。你能解釋爲什麼在tblappointment之後的其餘表格上的OUTER JOIN是需要的嗎? – Ikke 2009-09-28 14:06:08

+0

我把我的回答放在上面的正文中,因爲評論太長了。 – 2009-09-28 14:29:34

0

該查詢正在執行,因爲它應該。

一個離開了加盟將一個表中選擇的所有記錄,與另一個記錄加入他們的行列,併產生其中在第二個表中沒有記錄發現零點符合加入條件。

如果您正在尋找單獨的行爲,您可能需要考慮兩個單獨的查詢。

0

的問題是,你所參加的方式(大部分都被加入到你的左外連接表),只要您參加過的,如果在外部連接表的值是什麼,有沒有其他領域加入。嘗試重新調整您的查詢,以便所有內容都與您的員工ID結合起來。我通常使用左連接的表格,儘量限制內部連接。

所以我的查詢會是這樣的:

選擇 TA.id, TEI.displayname, TA.threatment_id, TTS.appointment_date FROM tblemployee AS TE INNER JOIN tblemployeeinfo AS TEI ON TEI .employeeinfoid = TE.employeeinfoid 內部聯接tblthreatment AS T ON TA.threatment_id = T.threatmentid 內部聯接tblappointments AS ON TTS.id = TA.appointments_id AND TTS.appointment_date = '2009-09-28' 內部聯接TTS tblcustomerc ARD AS TCC ON TCC.customercardid = TTS.customercard_id LEFT OUTER JOIN tblappointment AS TA ON TE.employeeid = TA.employee_id WHERE TE.employeeid = 4

其中最後一個外部聯接只是給我的一個價值信息,而不是全部使用它來加入更多的東西。爲了提高速度,您還需要嘗試儘可能快地限制您的信息與前幾個內部聯接,然後外部聯接最後將可能的空值聯接到最小的數據集上。我希望這有助於,如果它很混亂,我很抱歉...我還沒有喝過咖啡因。

1

在您的查詢中,您將LEFT OUTER JOIN加入到tblappointment表中,但隨後您將INNER JOIN加入到tblthreatment和tblappointments表中。

您應該嘗試按照您希望數據存在的順序來組織您的查詢。然後在大多數簡單的查詢中,一旦你執行了一個OUTER連接,那麼大多數表將成爲一個OUTER連接。這是沒有意義的規則和複雜的查詢可能會有所不同,但在簡單查詢的大多數情況下,這是一個很好的做法。

爲您的查詢嘗試這樣的事情。

SELECT 
    TA.id, 
    TEI.displayname, 
    TA.threatment_id, 
    TTS.appointment_date 
FROM 
    tblemployee AS TE 
INNER Join 
    tblemployeeinfo AS TEI 
ON 
    TEI.employeeinfoid = TE.employeeinfoid 
LEFT OUTER Join 
    tblappointment AS TA 
ON 
    TE.employeeid = TA.employee_id 
LEFT OUTER JOIN 
    tblthreatment AS T 
ON 
    TA.threatment_id = T.threatmentid 
LEFT OUTER JOIN 
    tblappointments AS TTS 
ON 
    TTS.id = TA.appointments_id 
AND 
    TTS.appointment_date = '2009-09-28' 
LEFT OUTER JOIN 
    tblcustomercard AS TCC 
ON 
    TCC.customercardid = TTS.customercard_id 
WHERE 
    TE.employeeid = 4 
+0

這個查詢的大部分都是自動生成的,我沒有費心去構造它。 – Ikke 2009-09-28 13:59:56