LoginSignup
0
0

More than 1 year has passed since last update.

CROSS JOIN(クロス結合)を通したINNER JOINの考え方

Last updated at Posted at 2021-07-25

※この記事は実務半年〜1年の方に向けた記事です。

SQLの結合を書く際、なかなか思い通りの結果が取得できずに結合条件に悩むことがあります。
ただ、とある現場でクロス結合を使えばだいぶ楽になることを学んだので、今回はその考え方を共有してきます。

まず、今回使用するテーブルは次の通りです。
スクリーンショット 2021-07-25 19.16.56.png

これを単純にクロス結合します。クロス結合とは、総当たりで結合するということです。

SELECT * FROM restaurant_name,restaurant_reputaion

スクリーンショット 2021-07-25 19.25.14.png

こうなります。これでも総当りの意味がいまいちつかめない人のために一部とりだすと、こういうことです(僕は最初そうでした)

スクリーンショット 2021-07-25 21.54.15.png

つまり、
①あくせる亭という一行に対して評判テーブルがすべてくっつき、
②総当たりのためあくせる亭が評判テーブルの行数分増えている
ということです。あとは同じことを左側のテーブル(ここではレストランテーブル)の行数だけ繰り返しているだけです。

ここまででクロス結合の考え方はつかめたはずです。
次に、クロス結合にある条件を付け足します。

SELECT * FROM restaurant_name,restaurant_reputaion 
WHERE restaurant_name.id = restaurant_reputaion.id

日本語にすると「レストランテーブルのidと評判テーブルのidが等しいものをくっつける」といったところでしょうか。
これを先程の画像を用いて説明します。

スクリーンショット 2021-07-25 22.18.32.png

まず先程同様あくせる亭に評判テーブルがくっつきます。
続いてwhere句をみると、「レストランテーブルのidと評判テーブルのidが等しいものをくっつける」ので、
id=1以外の行はくっつかずに消滅します。あとはレストランテーブルの行数分これを繰り返していきます。
すると結果が、

スクリーンショット 2021-07-25 22.26.03.png

となります。
今回はもう結果は貼りませんが、これはINNER JOINを使用したSQL文の

SELECT * FROM restaurant_name INNER JOIN restaurant_reputaion ON restaurant_name.id = restaurant_reputaion.id

と同じ結果になります。
INNER JOINでの結合条件が思いつかないときは、まずクロス結合で結果を表示してから、
絞っていくとわかりやすいかと思うのでぜひ試してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0