FROM句での結合条件が異なると、生成される結果が大きく異なる場合があります。
- 開催されているコース
- コースの場所
- 希望されているが開催されていないコース
- コースを希望する従業員
例: 完全外部結合と右外部結合
次の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を使用する場合、コースC200とC400は実際に開催されているなどの外部結合の結果は表示されません。
ON句でのWHERE句の使用については、外部結合でのON句とWHERE句のコーディングを参照してください。