SQLでは、制約なしの結合(または相互結合)ができます。これは、結合するテーブルどうしのWHERE句を指定しない結合です。制約なしの結合の結果は、直積とも呼ばれます。
1行目の各コンポーネントと2行目の各コンポーネントとを掛けてできた、すべての順序付き組の集合は、2つのテーブルの相互結合を実行することによって得られた結果と同じです。したがって、結合とは、結合された各テーブルの行の積です。
相互結合が実行される理由
あるテーブルの各行と、それとは別のテーブルの各行とを連結しても、あまり有益な結果は生成されません。一般に、相互結合を要求する理由は、パフォーマンス ベンチマークを測定するためです。実際には相互結合のアプリケーションは、基本的に存在しません。
相互結合を実行する前に、以下の考慮事項に取り組む必要があります。
- これほど広い範囲で情報価値のない操作を実行する必要があるのはなぜか。
- 相互結合を行なうとどの程度のコスト(リソース消費量)がかかるか。
例えば、いずれも1,000行入っている2つのテーブルtable_aとtable_bの相互結合では、100万行の結合テーブルを返します。相互結合は、ユーザーのスプール空間の制限を超えて、容易にトランザクションをアボートすることができます。
相互結合の指定
複数のテーブルの外部結合ではない直積を返すには、次のSELECT文を書きます。
SELECT ... FROM table_a CROSS JOIN table_b;
予約語シーケンスのCROSS JOINはオプションであるため、同じ結果になる次のSELECT文を書くこともできます。
SELECT ... FROM table_a,table_b;
最初の書式では明示的なCROSS JOIN構文を使用しており、問合わせの目的が相互結合であることがより明確に示されています。
table_aには5行あり、table_bには3行あると仮定すると、直積は3 x 5、すなわち15です。この複数のテーブルの無制約結合には、結果として15行が返されます。