使用外部聯結

內部聯結只會傳回兩個資料表中至少有一個資料列符合聯結條件的資料列。內部聯結將刪除不符合其他資料表之資料列的資料列。然而,外部聯結則至少傳回 FROM 子句提到的一個資料表或檢視,只要這些資料列符合任何 WHERE 或 HAVING 搜尋條件。在左方外部聯結中,所有資料列將擷取自參考到的左方資料表,在右方外部聯結中,所有資料列將擷取自參考到的右方資料表。在完整外部聯結中,所有資料列將擷取自兩個資料表。

SQL Server 針對 FROM 子句中指定的外部聯結,可使用下列 ISO 關鍵字:

  • LEFT OUTER JOIN 或 LEFT JOIN

  • RIGHT OUTER JOIN 或 RIGHT JOIN

  • FULL OUTER JOIN 或 FULL JOIN

使用左外部聯結

假設 Product 資料表和 ProductReview 資料表以它們的 ProductID 資料行進行聯結。結果只會顯示出已撰寫評論的產品。

若想納入所有的產品,而不管是否已撰寫了評論,可使用 ISO 左外部聯結。以下為此查詢:

USE AdventureWorks2008R2;
GO
SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID

不論 ProductReview 資料表中的 ProductID 資料行是否有相符者,LEFT OUTER JOIN 都會在結果中納入 Product 資料表的所有資料列。請注意,若結果中的產品沒有相符的產品評論識別碼,則該資料列的 ProductReviewID 資料行會包含 Null 值。

使用右外部聯結

假設 SalesTerritory 資料表和 SalesPerson 資料表以它們的 TerritoryID 資料行進行聯結。結果會顯示出已指定給銷售人員的區域。ISO 右方外部聯結運算子 RIGHT OUTER JOIN 指出第二個資料表中的所有資料列將包含於結果之中,不管第一個資料表中是否有符合的資料。

若要在結果中納入所有的銷售人員,而不管銷售人員是否已指派了區域,可使用 ISO 右外部聯結。以下是右外部聯結的 Transact-SQL 查詢及結果:

USE AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;

以下為結果集:

Territory BusinessEntityID

-------------------------------------------------- -------------

NULL 268

Northeast 275

Southwest 276

Central 277

Canada 278

Southeast 279

Northwest 280

Southwest 281

Canada 282

Northwest 283

NULL 284

United Kingdom 285

France 286

Northwest 287

NULL 288

Germany 289

Australia 290

(17 個資料列受到影響)

外部聯結可利用述詞來進一步加以限制。此範例包含相同的右外部連結,但僅包括銷售額少於 $2,000,000 的銷售區域:

USE AdventureWorks2008R2;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory st 
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID 
WHERE st.SalesYTD < $2000000;

如需述詞的詳細資訊,請參閱 WHERE (Transact-SQL)

使用完整外部聯結

若要在聯結的結果中納入不相符資料列,以保留不相符的資訊,請使用完整外部聯結。SQL Server 提供完整外部聯結運算子 FULL OUTER JOIN,它會納入兩個資料表中的所有資料列,而不管另一資料表是否有相符值。

假設 Product 資料表和 SalesOrderDetail 資料表以它們的 ProductID 資料行進行聯結。結果只會顯示出已有銷售訂單的產品。ISO 完整外部聯結運算子指出兩個資料表中的所有資料列都必須包含於結果之中,而不管資料表中是否有符合的資料。

您可以在完整外部聯結中包含 WHERE 子句,只傳回在另一個資料表上沒有相符資料的資料列。下列查詢只會傳回沒有相符銷售訂單的產品,以及沒有相符產品的銷售訂單 (不過,本案例中的所有銷售訂單都有相符的產品)。

USE AdventureWorks2008R2;
GO
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL
ORDER BY p.Name ;