2009年11月20日 星期五

OUTER JOIN的注意事項

首先先說明一下什麼是OUTER JOIN。


SELECT * FROM A
JOIN B
ON A.ID = B.ID


上例是典型的 INNER JOIN,其意思為將 A 資料表 與 B 資料表 其 ID 欄位資料相等的結果列出。

OUTER JOIN 則是當我們有某些資料不僅是要 show 出兩個資料表相等的結果,

可能有一方以上的資料需要全部顯示,即使另一方沒有該筆資料的情況下,

就要使用 OUTER JOIN,沒有資料的另一方會顯示為NULL。

OUTER JOIN 有三種選項:LEFT、RIGHT 與 FULL

此三者的差別依序為 以左邊 TABLE 為主、以右邊 TABLE 為主 與 兩邊的 TABLE 全部都要顯示。


SELECT * FROM A
LEFT|RIGHT|FULL (OUTER) JOIN B
ON A.ID = B.ID


接著要來說明一個常犯的錯誤,假設我們想要找出所有顧客其下訂單所有產品的情況,
其範例如下:

SELECT * FROM Customers a
LEFT JOIN Orders b
ON a.ID = b.CustomerID
JOIN OrderDetail c
ON b.ID = c.OrderID
JOIN Products d
ON c.ProductID = d.ID


當執行 LEFT JOIN 時,客戶與訂單的確會因為 OUTER JOIN 而將所有的顧客列出,

然而 訂單明細 與 訂單 是使用 Equal JOIN,因此其結果即只剩下兩者相等的情況!

其正確的作法因如下:


-- 範例一
SELECT * FROM Customers a
LEFT JOIN Orders b
ON a.ID = b.CustomerID
LEFT JOIN OrderDetail c
ON b.ID = c.OrderID
LEFT JOIN Products d
ON c.ProductID = d.ID
-- 範例二 使用括弧
SELECT * FROM Customers a
LEFT JOIN (
Orders b
JOIN OrderDetail c
ON b.ID = c.OrderID
JOIN Products d
ON c.ProductID = d.ID
)
ON a.ID = b.CustomerID

沒有留言:

張貼留言