inner joinで行が増えすぎるときの対処法

クエリを書きはじめたばかりだと、inner joinは難しくないでしょうか?

構文自体が複雑というわけではないです。
しかし、欲しいデータを一発で取とれないため
難しいと感じる方も多いのではないかと。

あれもこれもと複数のテーブル結合させていると
行が増えて思った結果を得られないこともあります。

ですので、テーブル結合はgroup byと並んで躓きポイントと考えています。

そこで今回はinner joinのクエリを作るうえでのポイントを紹介します。

思った以上に行が増えてしまう」で悩んでいる方には
参考になるような内容です。

selectに使用する列を把握しよう

クエリのゴール(目的)はselect句にあります。
select句で、結合するテーブル選定をしっかり把握できていると良いです。

まずは、select句で抽出する値にはどのテーブルと列が必要か考えてみます。

select句で指定する値はテーブルの値をそのまま使用することもあれば、
加工することもあります、複数の列を合算することもあるでしょう。
一度でも使用するテーブルがあれば全てピックアップします。

この時点で、使用するテーブルと列まで確定できていると
ゴールが完全に見えている状態です。

これはinner joinに限らず有効です。
いろいろなクエリで試してみてください。

結合したときレコードがどちらが「多い」かを意識する

ここでの「多い」はいわゆるリレーションの中での話です。
例を出します。

ユーザーと注文の関係であれば、ユーザー1人で複数回の注文ができます。
これが「一対多」の関係ですね。

この一対多や一対一でつないでいくと最も「多い」テーブルが何かがわかるので、
そのテーブルをfromに指定します。
例であれば、注文詳細が最も「多い」です。

縦に減らし、横に伸ばすように結合させる

いよいよテーブルの結合です。

先ほどリレーションまでは把握できているのであれば、inner joinは出来上がったも同然です。


ポイントは「inner joinで指定するテーブルのPKを必ずon句に指定すること」です。

fromに最も「多い」テーブルを指定しているため、
PKを指定すると次の特徴を得られます。

  • 結合できると列が増える
  • 結合できると行は増えない

※PKと同様に唯一を保障できるのであればその条件をon句に指定します。

つまり、結合させて作る表は横に伸びていくイメージになります。

これに対してPKを指定しないと

  • 結合できると列が増える
  • 結合できると行は増える

になり、縦にも横にも表が膨張していきます。
これを意図してやっているのであれば問題ないです。

しかし、行が増えること困っている場合は
inner joinで指定するテーブルのPKを必ずon句に指定すること」をお勧めします。

まとめ

以上でinner joinのクエリを作るポイントは終了です。
まとめると、

  • select句で指定するにはどのテーブルが必要かまず把握する
  • 一対多や一対一でつないだとき最も「多」いテーブルをfromに指定する
  • inner joinで指定するテーブルのPKを必ずon句に指定する

もし、行が増えることに悩んでいる方は参考にしてみてください。