ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 補足 結合を掛け算として考える

SQL 指南書集 目次 - ray88’s diary

SQL指南書 外部結合⑤ 掛け算として結合

まず、結合の基本を理解しましょう。結合は、2つのテーブル間で特定の条件(通常は2つのカラムの値が一致すること)を満たすすべての行の組み合わせを生成します。

**CROSS JOIN(直積)**を考えると、2つのテーブルのすべての行の組み合わせを生成します。たとえば、テーブルAが3行、テーブルBが4行の場合、CROSS JOINの結果は3 x 4 = 12行になります。これが「掛け算」としての結合の考え方です。

一方、INNER JOINやLEFT JOINでは、結合条件が指定されます。この結合条件に一致する行のみが結果に含まれます。したがって、すべての行の組み合わせが結果に含まれるわけではありません。
-------------------------------------------------------------------------------------------

1.結合を掛け算として考える
このフレーズは、2つのテーブルを結合するとき、一方のテーブルの行数ともう一方のテーブルの行数を掛け合わせた数の行が出力される可能性があることを指しています。例えば、テーブルAが3行、テーブルBが4行の場合、最大で3x4=12行の結果が得られることを意味します。

2.結合は1対1でなくとも1対多なら行数は(不当には)増えない
1対1の結合は、各テーブルの行が1行のみ対応する場合を指します。1対多の結合は、一方のテーブルの1行が他方のテーブルの複数行に対応する場合を指します。この場合、結果の行数は増えますが、2つのテーブルの行数を単純に掛け合わせた数よりは少なくなります。このコードの場合、Items テーブルの各商品は、SalesHistory テーブルの0行以上に対応します。

3.中間ビューをなくすことによりパフォーマンスが向上する
先のクエリでは、SalesHistory テーブルからデータを取得して集約した結果を一時的なビュー(サブクエリ)として作成し、それをItems テーブルと結合していました。新しいクエリでは、この中間ステップをスキップして、直接Items テーブルとSalesHistory テーブルを結合してから集約を行っています。このアプローチの方が効率的である場合が多いです。

この変更の背後にある考え方は、まずテーブルを結合してから集約を行うことで、計算が効率的になるということです。これは、データベースの最適化エンジンが、中間結果を生成・保存することなく、全体の計算を行えるためです。