使用外部聯結
雖然與內部聯結不一樣常見,但在多數據表查詢中使用外部聯結可以提供商務數據的替代檢視。 和內部聯結相同,您將會表達資料表之間的邏輯關聯性。 不過,您不僅會擷取具有匹配屬性的資料列,也會擷取存在於一個或兩個表中的所有資料列,即便在另一個表中沒有匹配。
先前,您已瞭解如何使用 INNER JOIN 來尋找兩個數據表之間的相符數據列。 如您所見,查詢處理器會篩選出不符合 ON 子句述詞中所表示條件的數據列,以建置 INNER JOIN 查詢的結果。 結果是只會傳回其他數據表中具有相符數據列的數據列。 使用 OUTER JOIN 時,您可以選擇顯示資料表之間具有相符數據列的所有資料列,以及其他數據表中沒有相符的所有數據列。 讓我們看看一個範例,然後探索流程。
首先,檢查下列使用 INNER JOIN 撰寫的查詢:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
這些列表示 HR.Employee 和 Sales.SalesOrder 之間的匹配。 只有這兩個數據表中的 EmployeeID 值才會出現在結果中。
現在,讓我們檢查下列撰寫為 LEFT OUTER JOIN 的查詢:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
此範例會使用 LEFT OUTER JOIN 運算符,此運算符會指示查詢處理器保留左側數據表中的所有數據列(HR。員工)並顯示 Sales.SalesOrder 中相符數據列的 Amount 值。 不過,系統會傳回所有員工,無論該員工是否已承辦銷售訂單。 如果員工沒有相符的銷售訂單,查詢將會傳回 NULL,而不會顯示 Amount 值。
OUTER JOIN 語法
外部聯結是使用 OUTER JOIN 前面的關鍵詞 LEFT、RIGHT 或 FULL 來表示。 關鍵詞的目的是指出應該保留哪個數據表(關鍵詞 JOIN 的哪一端),並顯示其所有數據行;不論匹配或不匹配。
使用 LEFT、RIGHT 或 FULL 來定義聯結時,您可以省略 OUTER 關鍵詞,如下所示:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
不過,就像 INNER 關鍵詞一樣,撰寫明確指定所用聯結類型的程式代碼通常很有幫助。
使用 OUTER JOIN 撰寫查詢時,請考慮下列指導方針:
- 如您所見,表別名不只在 SELECT 清單中使用,也被用在 ON 子句中。
- 如同 INNER JOIN,OUTER JOIN 可以在單一比對數據行或多個比對屬性上執行。
- 不同於 INNER JOIN,FROM 子句中列出和聯結數據表的順序對於 OUTER JOIN 非常重要,因為這會決定您在聯結中選擇 LEFT JOIN 還是 RIGHT JOIN。
- 存在 OUTER JOIN 時,多資料表聯結也會更加複雜。 當 OUTER JOIN 的結果中存在 NULL 值時,它可能會在中繼結果與第三個數據表聯結時導致問題。 具有 NULL 的資料列可能會被第二個聯結的述詞篩選掉。
- 若要只顯示不存在任何相符項目的資料列,請在 WHERE 子句中於 OUTER JOIN 述詞之後新增針對 NULL 的測試。
- FULL OUTER JOIN 很少使用。 它會傳回兩個數據表之間的所有相符數據列,以及第一個數據表中沒有在第二個數據表中找到相符項目的所有數據列,還有第二個數據表中在第一個數據表中沒有相符項目的所有數據列。
- 在沒有 ORDER BY 子句的情況下,無法預測資料列返回的順序。 無法先得知相符或不相符的數據列是否會傳回。