17.05 - 完全外部結合 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-175K-JPN
Language
日本語 (日本)

完全外部結合では、両方のテーブルの中の内部結合の結果に返されなかった行が、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_ATable_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に注意してください。