外部結合の使用

内部結合から行が返されるのは、両方のテーブルで結合条件に一致する行が少なくとも 1 行ある場合のみです。つまり、内部結合では、他方のテーブルの行と一致しない行は除外されます。これに対し、外部結合からは、FROM 句で指定された少なくとも 1 つのテーブルまたはビューにあり、任意の WHERE 検索条件または HAVING 検索条件を満たしているすべての行が返されます。左外部結合の場合、参照される左側のテーブルからすべての行が取得されます。右外部結合の場合、参照される右側のテーブルからすべての行が取得されます。完全外部結合の場合、両方のテーブルのすべての行が返されます。

SQL Server では、FROM 句に指定されている外部結合に次の ISO キーワードを使用します。

  • LEFT OUTER JOIN または LEFT JOIN

  • RIGHT OUTER JOIN または RIGHT JOIN

  • FULL OUTER JOIN または FULL JOIN

左外部結合の使用

ProductID 列に基づく Product テーブルと ProductReview テーブルの結合について考えます。結果には、評価が書き込まれた製品のみが表示されます。

その製品に対して評価が書き込まれたかどうかに関係なく、すべての製品が結果に含まれるようにするには、ISO 左外部結合を使用します。次にクエリを示します。

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

LEFT OUTER JOIN により、ProductReview テーブルの ProductID 列に一致するデータがあるかどうかに関係なく、Product テーブルのすべての行が結果に含められます。ある製品に対して一致する製品評価 ID がない場合、結果では、その行の ProductReviewID 列に NULL 値が含まれていることに注意してください。

右外部結合の使用

TerritoryID 列に基づく SalesTerritory テーブルと SalesPerson テーブルの結合について考えます。結果には、ある販売員に割り当てられたすべての区域が表示されます。ISO 右外部結合演算子である RIGHT OUTER JOIN は、1 つ目のテーブルに一致するデータがあるかどうかに関係なく、2 つ目のテーブルのすべての行が結果に含められることを示します。

販売員に区域が割り当てられているかどうかに関係なく、結果にすべての販売員を含めるには、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 という完全外部結合演算子が用意されています。この演算子を使用すると、他方のテーブルに一致する値が含まれているかどうかに関係なく、両方のテーブルのすべての行が結果に含められます。

ProductID 列に基づく Product テーブルと SalesOrderDetail テーブルの結合について考えます。結果には、販売注文がある製品のみが表示されます。ISO FULL OUTER JOIN 演算子は、両方のテーブルに一致するデータがあるかどうかに関係なく、結果に両方のテーブルのすべての行が含められることを示します。

完全外部結合で 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 ;