外部結合の使用
内部結合から行が返されるのは、両方のテーブルで結合条件に一致する行が少なくとも 1 行ある場合のみです。つまり、内部結合では、他方のテーブルの行と一致しない行は除外されます。これに対し、外部結合からは、FROM 句で指定された少なくとも 1 つのテーブルまたはビューにあり、任意の WHERE 検索条件または HAVING 検索条件を満たしているすべての行が返されます。左外部結合の場合、参照される左側のテーブルからすべての行が取得されます。右外部結合の場合、参照される右側のテーブルからすべての行が取得されます。完全外部結合の場合、両方のテーブルのすべての行が返されます。
Microsoft SQL Server 2005 では、FROM 句で指定される外部結合に対して次の SQL-92 キーワードを使用します。
- LEFT OUTER JOIN または LEFT JOIN
- RIGHT OUTER JOIN または RIGHT JOIN
- FULL OUTER JOIN または FULL JOIN
左外部結合の使用
ProductID
列に基づく Product
テーブルと ProductReview
テーブルの結合について考えます。結果には、評価が書き込まれた製品のみが表示されます。
その製品に対して評価が書き込まれたかどうかに関係なく、すべての製品が結果に含まれるようにするには、SQL-92 左外部結合を使用します。次にクエリを示します。
USE AdventureWorks;
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
テーブルの結合について考えます。結果には、ある販売員に割り当てられたすべての区域が表示されます。SQL-92 右外部結合演算子である RIGHT OUTER JOIN は、1 つ目のテーブルに一致するデータがあるかどうかに関係なく、2 つ目のテーブルのすべての行が結果に含められることを示します。
販売員に区域が割り当てられているかどうかに関係なく、結果にすべての販売員を含めるには、SQL-92 右外部結合を使用します。次に右外部結合の Transact-SQL クエリとその結果を示します。
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;
以下に結果セットを示します。
Territory SalesPersonID
-------------------------------------------------- -------------
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 row(s) affected)
外部結合は、述語を使用して制限を加えることができます。次の例には同じ右外部結合が含まれていますが、売上が 2,000,000 ドル未満の販売区域のみが含まれます。
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
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
テーブルの結合について考えます。結果には、販売注文がある製品のみが表示されます。SQL-92 FULL OUTER JOIN 演算子は、両方のテーブルに一致するデータがあるかどうかに関係なく、結果に両方のテーブルのすべての行が含められることを示します。
完全外部結合で WHERE 句を使用して、テーブル間で一致するデータがない行のみが返されるようにすることができます。次のクエリにより、一致する販売注文がない製品、および製品と一致しない販売注文のみが返されます (ただし、この場合はすべての販売注文が製品と一致しています)。
USE AdventureWorks;
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 ;
参照
概念
その他の技術情報
演算子 (Transact-SQL)
SELECT (Transact-SQL)
SELECT の例 (Transact-SQL)