外部結合を使用する

完了

内部結合ほど一般的ではありませんが、マルチテーブル クエリで外部結合を使用すると、ビジネス データの代替ビューを提供できます。 内部結合と同様に、テーブル間の論理リレーションシップを表します。 ただし、一致する属性を持つ行だけでなく、一方または両方のテーブルに存在するすべての行 (他のテーブルに一致があるかどうかに関係なく) も取得します。

以前は、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.EmployeeSales.SalesOrder の間の一致を表しています。 両方のテーブルにある EmployeeID 値のみが結果に表示されます。

Employee セットと SalesOrder セットの一致するメンバーを示すベン図

次に、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 が返されます。

Employee セットと SalesOrder セットの外部結合結果を示すベン図

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 句なしで行が戻ってくる順序を予測する方法はありません。 一致した行または一致しない行が最初に返されるかどうかを知る方法はありません。