次の方法で共有


外部結合の使用

内部結合から行が返されるのは、両方のテーブルで結合条件に一致する行が少なくとも 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)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手