ON句は、FROM句内では、外部結合の各操作に必要ですが、外部結合にはWHERE句を含めることもできます。
WHERE句での制限は、外部結合の最終的な結果のテーブルにのみ適用されます。WHERE句は、外部結合の結合条件は定義しません。
例: WHERE句との結合
次のSELECT文を考慮します。
SELECT offerings.course_no, enrollment.emp_no FROM offerings LEFT JOIN enrollment ON offerings.course_no = enrollment.course_no WHERE location = 'El Segundo';
この問合わせは、次のテーブルにある中間派生結果を生成します。
o.course_no | e.emp_no |
C100 | 236 |
C100 | 668 |
C200 | ? |
C400 | ? |
BTEQレポートはnullを疑問符(?)文字で表わします。
次に、問合わせによって開催地の制限を適用します。制限が適用された後(コースC200はAtlantaで開催)、結果は次のテーブルのように示されます。
o.course_no | e.emp_no |
C100 | 236 |
C100 | 668 |
C400 | ? |
例: ON句との外部結合
次のSELECT文のように、開催地の制限をON句に含めるとします。
SELECT offerings.course_no, enrollment.emp_no FROM offerings LEFT OUTER JOIN enrollment ON (location = 'El Segundo') AND (offerings.course_no = enrollment.course_no);
このような制限は結合条件ではありません。これは、検索条件です。
開催地の制限は、左外部結合の実行後ではなく内部結合の実行時に適用されます。
問合わせがこのように成された場合、次のテーブルが示すような混乱した結果になります。
o.course_no | e.emp_no |
C100 | 236 |
C100 | 668 |
C200 | ? |
C400 | ? |
BTEQレポートはnullを疑問符(?)文字で表わします。
開催地の制限は内部結合(左外部結合)の実行時に適用されましたが、Atlantaで開催されるコースC200を除外せずに結果を返しました。C200は、内部結合の結果として返されない行の一部として返されました。
ON句では検索条件ではなく結合条件を使用する
予想外の結果を避けるため、通常は、結合する2つのテーブルの列を参照するにはON句のみを使用しなければなりません。つまり、ON句には結合条件のみを指定し、検索条件は指定しないでください。結合での検索条件の設定も参照してください。
例: 結合条件ではないWHERE句の制限
以下の2つのテーブル(table_aおよびtable_b)について考えてみてください。
table_a.a | table_a.b | table_b.a | |
3 | 1 | 3 | |
6 | 6 | 6 |
次のSELECT文は、次の結果を生成します。左外部結合は、次のテーブルにデータを返します。
SELECT * FROM table_a LEFT OUTER JOIN table_b ON table_a.a = table_b.a WHERE table_a.b > 5;
この問合わせは、次のテーブルに中間派生結果を生成します。
table_a.a | table_a.b | table_b.a | |
1 | 3 | ||
6 | 6 | 6 |
WHERE句の制限が適用されると、最終結果は次のテーブルに示すようにレポートされます。
table_a.a | table_a.b | table_b.a | |
6 | 6 | 6 |
例: 結合条件のWHERE句の制限
WHERE句の制限を結合条件の一部として含めた場合には、どうなるでしょうか。次のSELECT文を考慮します。
SELECT * FROM table_a LEFT OUTER JOIN table_b ON (table_a.b > 5) AND (table_a.a = table_b.a);
この問合わせの結果は、次の結果のテーブルが示すよう混乱した結果になります。
table_a.a | table_a.b | table_b.a | |
6 | 6 | 6 | |
3 | 1 | ? |
BTEQレポートはnullを疑問符(?)文字で表わします。
内部結合(左外部結合の)を指定した結合条件は、6、6、6だけを結果として返すことに注意してください。ただし、内部結合の結果として返されなかった行は、nullで拡張されて返されます。したがって、例の2番目の行は、望むような結果ではない、3、1、nullになります。
ON句での検索条件の使用
ON句に検索条件が必要な場合があります。たとえば、開催されているすべてのコースと、従業員236によって要求されるコースをリストするためには、次の問合わせを使用します。
SELECT offerings.course_no, enrollment.emp_no FROM offerings LEFT OUTER JOIN enrollment ON offerings.course_no = enrollment.course_no AND enrollment.emp_no = 236;
結合での検索条件の設定
次のテーブルは外部結合および内部結合の検索条件を設定するためのガイドを示しています。
結合タイプ | 検索条件の句 |
---|---|
外部 | WHERE |
内部 | ON |
左外部結合では、外テーブルは、左側のテーブルであり、内テーブルは、右側のテーブルです。
外部結合で使用するON句とWHERE句のコーディングに関するルール
- 外部結合の各テーブルで使用するON句には、1つまたは複数の結合条件、または結合用語が必要です。
これらの結合条件は、内部テーブルと重なる外部テーブルの行を定義します。
ただし、検索条件をWHERE句の内部テーブルに適用する場合は、その条件を同じようにON句にも適用する必要があります。
- 最善の方法は、ON句で結合条件だけを使用することです。
内部テーブルのON句における検索条件には、応答セットにおける行数制限はありません。この条件は外部テーブルに重ねるのに適した行を定義します。
- 外部結合にはWHERE句を含めることもできます。ただし、WHERE句を使用して返される結果は明確でも直観的でもない場合があります。外部結合のケース スタディおよびそれに続くトピックを参照してください。
- 地理空間インデックスを外部結合に対して使用することはできません。地理空間データについては、SQL地理空間型を参照してください。
外部テーブルで修飾する行数(それゆえ応答セット)を制限するには、外部テーブルの検索条件をWHERE句に含める必要があります。外部結合が作成された後でなければ、最適化ルーチンはWHERE句を論理的に適用しないことに注意してください。条件の実際の適用は常に最適化ルーチンが問合わせの実装のために選択する方法によって決定されます。
内部テーブルに対する検索条件をWHERE句の中で指定すると、キーワードLEFT/RIGHT/FULL OUTER JOINを問合わせで明示的に指定したとしても、その結合は論理的には内部結合に相当します。最適化ルーチンは、そうした結合を内部結合として扱い、複雑なプロセス全体を単純なステップに書き直して、問合わせを単純化します。