SQL 複数の結合キーや複数のテーブルのJOIN

複数の結合キーや複数のテーブルのJOIN

JOINの解説では2つのテーブルを1つの結合キーで結合する場合を紹介した。ここではさらに複数の結合キーや複数のテーブルでのJOINを説明する。

サンプルデータ

kiso1_pos,kiso1_customer,kiso1_master,kiso1_honsuuを使う。使い方はSQL学習用サンプルデータを参照。

複数の結合キーでのJOIN

年月と店舗、都道府県と市町村など1つのカラムだけでは特定できず2つ以上のカラムを使わないとうまく結合できない場合がある。ExcelのVlookup関数を使うために結合した新しいカラムを作ったことがある人も多いだろう。

SQLの場合は複数の結合キーでの結合ができる。書き方は結合キーが1つの場合にANDで結合キーを加えるだけだ。

なお、他のJOIN(LEFT JOIN,RIGHT JOIN,FULL JOIN)でも同じなのでINNER JOINでのみ解説する。

複数の結合キーでのJOINの書き方

kiso1_posにkiso1_masterをINNER JOINしてみよう。category_idが両方にあるので素直にそこで結合してみる。

SELECT p.*,category_name,item_name,tanka FROM kiso1_pos p
INNER JOIN kiso1_master m
ON p.category_id= m.category_id

この結果はレコード数が増えており何かが違う。そこでkiso1_masterの中身を見てみると、category_idが重複していることに気づくだろう。つまりこれは結合キーのカラムに重複があることでレコード数が増えてしまっているという状況だ。

ではitem_idを使えばうまくいきそうかとみてみると、やはりこちらも重複しておりこれだけで結合するとおかしくなる。

そこで、categroy_idとitem_idの両方を結合キーに使えればよさそうだ、となる。書き方は

SELECT p.*,category_name,item_name,tanka FROM kiso1_pos p
INNER JOIN kiso1_master m
ON p.category_id= m.category_id

AND p.item_id= m.item_id

このように最後に結合キーをANDで繋いで追加する。これで組として結合できる。

複数キーでのJOINの場合のUSING

複数キーでもUSINGが使える。カンマで繋げばいい。

SELECT p.*,category_name,item_name,tanka FROM kiso1_pos p
INNER JOIN kiso1_master m
USING(category_id,item_id)

3つ以上のテーブルでのINNER JOIN

1つのテーブルをJOINした後に別のテーブルをJOINすることもできる。また、テーブルAとテーブルBを結合した後に、テーブルBとテーブルCのカラムでの結合もできる。

kiso1_posにkiso1_honsuuを結合したいがkiso1_honsuuにはitem_nameしかないので間にkiso1_masterを挟む必要がある。そこで先ほど使ったkiso1_posにkiso1_masterを結合するクエリにkiso1_honsuuをJOINする部分を追加しよう。

SELECT p.*,category_name,m.item_name,tanka,honsuu FROM kiso1_pos p
INNER JOIN kiso1_master m
ON p.category_id= m.category_id

AND p.item_id= m.item_id
INNER JOIN kiso1_honsuu h
ON m.item_name=h.item_name

item_nameが重複するのでテーブル名を追加しているがそれ以外に特に困ることはないだろう。これを実行すると最後に本数が追加される。

なお最初にINNER JOINだからあと全部INNER JOINにする必要はなく他のJOINも使って構わない。

オフィシャルドキュメント

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax?hl=ja#join-types

2020年2月12日基礎1

Posted by shinu