完全外部結合では、両方のテーブルの中の内部結合の結果に返されなかった行が、nullで拡張されて外部結合の結果に返されます。
内部/外部テーブルの例
以下の例では、テーブル名として内部テーブルおよび外部テーブルを明示的に使用して、単純な完全外部結合がSELECT文のFROM句で構築される方法に、これらの用語を関連付ける方法を指示します。内部テーブルと外部テーブルを参照してください。
この例では、左外部結合の内部テーブルや外部テーブル参照の意味について示します。
outer_table_1 FULL OUTER JOIN outer_table_2
セクション1は、outer_table_1およびouter_table_2の内部結合(積集合)を表わします。セクション2と3は、両方の外部テーブルからの一致しない行を表わします。
外部結合の結果には、table_bが埋め込まれたtable_aの内部結合からの一致した行と、table_aおよびtable_bからの一致しない行が含まれます。
代数の設定では、結果は以下のとおりです。
(Table_A ∩ Table_B) + (Table_A - Table_B) + (Table_B - Table_A)
説明:
(Table_A ∩ Table_B)は、table_aおよびtable_bの内部結合からの一致する行セットです。
(Table_A - Table_B)は、table_aからの一致しない行セットです。
(Table_B - Table_A)は、table_bからの一致しない行セットです。
完全外部結合の実際的な例
例えば、カストマー教育によって現在開催中のコースが、コースに対する従業員のリクエストを満たしているかどうかを調べるために、開催されるコースとその開催地、および要望があるが開催されていないクラスとそれを要求する従業員を結果に含めると想定します。
この例では、前の例と同じ2つのテーブル、offerings、およびenrollmentを使用します。
offerings | enrollment | ||||
---|---|---|---|---|---|
course_no | beginning_dates | location | emp_no | course_no | |
C100 | 01/05/94 | El Segundo | 236 | C100 | |
C200 | 07/02/94 | Dayton | 236 | C300 | |
C400 | 10/07/94 | El Segundo | 668 | C100 |
この2つのテーブルに対して完全外部結合を実行した場合、両方のテーブルの中の内部結合の結果に返されない行は、nullで拡張されて外部結合の結果に返されます。
次のSELECT文は、次の結果テーブルに示すように、希望する結果を生成します。
SELECT offerings.course_no, offerings.location, enrollment.course_no,enrollment.emp_no, FROM offerings FULL OUTER JOIN enrollment ON offerings.course_no = enrollment.course_no;
o.course_no | o.location | e.course_no | e.emp_no |
---|---|---|---|
C100 | El Segundo | C100 | 236 |
C100 | El Segundo | C100 | 668 |
C200 | Dayton | NULL | NULL |
C400 | El Segundo | NULL | NULL |
NULL | NULL | C300 | 236 |
BTEQレポートはnullを疑問符(?)文字で表わします。
この結果では、C100のコースには2人の従業員が登録されており、C200とC400のコースには従業員が登録されていません。
この場合、offeringsテーブルとenrollmentテーブルの外部結合によって返されたnullは、意味のある値です。
従業員236が登録しているC300のコースは、顧客教育によって開催されるコースの中に含まれていませんし、その開催地もありません。最後の行のo.course_noとo.locationの列のnullに注意してください。