このトピックでは、複数のテーブルの結合に固有の操作についていくつか説明します。
一時派生テーブル
3つ以上のテーブルを結合すると、結合処理により、SELECT操作の間だけ定義される「一時派生テーブル」が論理的に作成されます。さまざまな要素に応じて、最適化ルーチンは、コード化された問合わせと単純化されたこの説明が意味する実際の実装との間の1:1の対応とは非常にかけ離れている問合わせプランを生成するように、リクエストを書き換えることがあります。
そのような一時テーブルは、結合テーブルとも呼ばれます。Teradataでは、このタイプの一時テーブルをスプールといいます。以下の例を検討します。
table_r LEFT OUTER JOIN table_S ON join_condition RIGHT OUTER JOIN table_t ON join_condition
table_rが、最初の結合条件に従ってtable_sとの左外部結合を実行された場合、派生テーブルが作成されます。このテーブルは派生テーブルであり、永久基本テーブルではありません。次に、この派生テーブルが、2番目の結合条件に従ってtable_tとの右外部結合(新しい左側の派生テーブルとして)を実行されます。
ON句の評価順序
table_aからの行がtable_bからの行に結合されている場合、またはtable_bからの行がtable_aからの行に結合されている場合、2つのテーブルの内部結合の結果は変化しません。集合代数では、内部結合は交換可能かつ関連的です。これは、いくつのテーブルが(内的に)結合されているかに関わりなく当てはまります。
内部結合は交換的かつ関連的であるため、最適化ルーチンは内部結合の最適な結合順序を任意で選択することができます。その結果は常に同じです。
一方、外部結合は通常は交換的でも関連的でもありません。最適化ルーチンは、交換的でも関連的でもないため、最善の結合結果を任意で選択することはできません。そのため、問合わせによって生成される特定の結果について知る方法はありません。
3つのテーブルに対して外部結合を実行するには、結合が正しく評価されるように、FROM句内の適切な位置にON句を指定して結合順序を指定しなければなりません。
最適化ルーチンでは、以下のルールに従って外部結合を生成します。
- 問合わせの中の最初のON句(左から右へと読み取られる)が最初に評価されます。
- ON句はいずれも、その直前の結合操作に適用されます。
例: 外部結合
以下に示す2つの外部結合の例は、ON句が強調される順序が異なるため、評価される順序も異なります。
1番目の例について、次の外部結合を考えてみます。
table_r LEFT OUTER JOIN table_s ON join_condition RIGHT OUTER JOIN table_t ON join_condition
このリクエストは、以下の手順で評価されます。
- table_rは、最初の結合条件に従ってtable_sに左外部結合が実行されます。
- 派生テーブル(すなわち、最初の結合操作の結果のテーブルであり、新しく派生した「左側」のテーブルになります)は、2番目の結合条件に従ってtable_tとの右外部結合が実行されることを意味します。
括弧を使用して評価の順序を指定する場合には、次のように書き直すことができます。
( table_r LEFT OUTER JOIN table_s ON join_condition ) RIGHT OUTER JOIN table_t ON join_condition
3つ以上のテーブルに対する外部結合を実行する場合には、括弧を使用してSELECT文を書くことができます。
2番目の例のように、ON句が別の位置にある場合には、異なる結果が生成されます。
table_r LEFT OUTER JOIN table_s RIGHT JOIN table_t ON join_condition ON join_condition
この文は、以下の手順で評価されます。
- table_sは、最初の結合条件に従ってtable_tに右外部結合が実行されます。
- 派生テーブル(新しく派生した「右側」のテーブルになります)は、2番目の結合条件に従ってtable_rとの左外部結合が実行されることを意味します。
括弧を使用して評価の順序を指定する場合には、次のように書き直すことができます。
table_r LEFT OUTER JOIN ( table_s RIGHT JOIN table_t ON join_condition ) ON join_condition
例: 左外部結合
次の結合操作に示すように、例: 外部結合のリクエストに4番目のテーブル、table_uを追加するとします。
table_r LEFT OUTER JOIN table_s ON join_condition JOIN table_t LEFT OUTER JOIN table_u ON join_condition ON join_condition
この文は次のように評価されます。
- table_rは、最初の結合条件に従ってtable_sに左外部結合が実行されます。
- table_tは、2番目の結合条件に従ってtable_uに左外部結合が実行されます。
- 派生した2つのテーブルは、3番目の結合条件に従って内部結合が実行されます。
括弧を使用して評価の順序を指定する場合には、次のように書き直すことができます。
( table_r LEFT OUTER JOIN table_s ON join_condition ) JOIN ( table_t LEFT OUTER JOIN table_u ON join_condition ) ON join_condition
内部結合のためにON句に指定された結合操作(この例ではJOIN)は、table_tとtable_uの左外部結合の実行に指定された結合条件によって、その動作から離されていることに注意してください。