外部結合を使用する
内部結合ほど一般的ではありませんが、複数テーブルのクエリで外部結合を使用すると、ビジネス データの別のビューを提供できます。 内部結合と同様に、テーブル間の論理的なリレーションシップを表現します。 ただし、一致する属性を持つ行だけでなく、一方または両方のテーブルに存在するすべての行も、他方のテーブル内に一致があるかどうかにかかわらず取得します。
以前、INNER JOIN を使用して、2 つのテーブル間で一致する行を検索する方法について学習しました。 確認したとおり、クエリ プロセッサにより、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.Employee) のすべての行を保持するようクエリ プロセッサが指示され、Sales.SalesOrder 内の一致行の Amount 値が表示されます。 ただし、販売注文を受けたかどうかにかかわらず、すべての従業員が返されます。 クエリにより、Amount 値の代わりに、一致する販売注文がない従業員に対して NULL が返されます。
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 は、一致する 1 つの列または一致する複数の属性に対して実行できます。
- INNER JOIN とは異なり、FROM 句でのテーブルのリストと結合の順序は OUTER JOIN に "関係します"。これにより、結合に対して LEFT または RIGHT のどちらを選択するかが決まるためです。
- OUTER JOIN が存在する場合、複数テーブルの結合はより複雑になります。 OUTER JOIN の結果に NULL が存在すると、中間結果が 3 番目のテーブルに結合された場合に問題が発生するおそれがあります。 NULL を含む行は、2 番目の結合の述語によってフィルターで除外される場合があります。
- 一致がない行のみを表示するには、OUTER JOIN の述語の後にある WHERE 句に、NULL のテストを追加します。
- FULL OUTER JOIN はめったに使用されません。 このメソッドでは、2 つのテーブル間の一致するすべての行、2 番目のテーブル内に一致のない最初のテーブルのすべての行、および最初のテーブル内に一致のない 2 番目のテーブルのすべての行が返されます。
- ORDER BY 句を使用せずに行が返される順序を予測することはできません。 一致する行または一致しない行が最初に返されるかどうかを知ることはできません。