外部結合で使用するON句のコーディング - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/vjt1596846980081.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1146
Product Category
Software
Teradata Vantage

FROM句での結合条件が異なると、生成される結果が大きく異なる場合があります。

例えば、coursesofferings、およびenrollmentという3つのテーブルを使用して、現在の開催コースが従業員のコースに対するリクエストを満たしているかどうかを調べると想定します。また、その問合わせの中に、次の情報を含めると想定します。
  • 開催されているコース
  • コースの場所
  • 希望されているが開催されていないコース
  • コースを希望する従業員

例: 完全外部結合と右外部結合

次のSELECT文では、offeringsテーブルは、最初のON条件(offerings.course_no = enrollment.course_no)に従ってenrollmentテーブルとの完全外部結合が実行されます。

     SELECT courses.course_no, offerings.course_no, offerings.location,
            enrollment.course_no, enrollment.emp_no
     FROM offerings
     FULL OUTER JOIN enrollment ON offerings.course_no =
                     enrollment.course_no
     RIGHT OUTER JOIN courses ON courses.course_no =
                      offerings.course_no;

この中間結合の結果を、次のテーブルに示します。

o.course_no e.course_no e.emp_no
C100 C100 236
C100 C100 668
C200 ? ?
C400 ? ?
? C300 236

BTEQレポートはnullを疑問符(?)文字で表わします。

次に、派生テーブル(上記に示した)は、2番目の結合条件(courses.course_no = offerings.course_no)に従ってcoursesテーブルとの右外部結合が実行されます。

最終結果は、次のテーブルのようになります。

c.course_no o.course_no e.course_no e.emp_no
C100 C100 C100 236
C100 C100 C100 668
C200 C200 ? ?
C400 C400 ? ?
C300 ? ? ?

例: CoursesとEnrollmentの右外部結合

ただし、次の例に示すように、同じSELECT文でも2番目の結合条件が異なって書かれている場合には、offeringsテーブルは、最初のJOIN条件(offerings.course_no = enrollment.course_no)に従ってenrollmentテーブルとの完全外部結合が実行されます。

     SELECT courses.course_no, offerings.course_no,
            enrollment.course_no, enrollment.emp_no
     FROM offerings
     FULL OUTER JOIN enrollment ON offerings.course_no =
                     enrollment.course_no
     RIGHT OUTER JOIN courses ON courses.course_no =
                      enrollment.course_no;

この中間結合の結果を、次のテーブルに示します。

o.course_no e.course_no e.emp_no
C100 C100 236
C100 C100 668
C200 ? ?
C400 ? ?
? C300 236

BTEQレポートはnullを疑問符(?)文字で表わします。

次に、派生テーブル(上記に示した)は、2番目の結合条件(courses.course_no = enrollment.course_no)に従ってcoursesテーブルとの右外部結合が実行されます。

最終結果は、次のテーブルのようになります。

c.course_no o.course_no e.course_no e.emp_no
C100 C100 C100 236
C100 C100 C100 668
C300 ? C300 236
C200 ? ? ?
C400 ? ? ?

例のON句の結合条件の比較

以下の2番目の結合条件は直観的には同じもののように思えるかもしれませんが、2つの異なる結合条件が使用されているため、SELECTの結果は異なります。

結合条件
courses.course_no = offerings.course_no 例: 完全外部結合と右外部結合
courses.course_no = enrollment.course_no 例: CoursesとEnrollmentの右外部結合

2番目の結合条件としてcourses.course_no=offerings.course_noを使用する場合、従業員236がコースC300に登録されているなどの外部結合の結果は表示されません。

ただし、2番目の結合条件としてcourses.course_no=enrollment.course_noを使用する場合、コースC200C400は実際に開催されているなどの外部結合の結果は表示されません。

ON句でのWHERE句の使用については、外部結合でのON句とWHERE句のコーディングを参照してください。