概要
複数のテーブルの情報を結合する際に使われる JOIN ですが、
結合のルールなどで使い方が異なります。
CROSS JOIN などあまり使われてないイメージのあるものを使う機会があったので、
それぞれの使いどころをメモしておこうと思う。
INNNER JOIN
クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY
- よく使われるイメージがある
- ON~ の条件で結合するデータのみ抽出する
LEFT JOIN
クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY
- これもよく使われるイメージがある
- TABLE1 のデータは全件表示し、ON~ の条件で結合したデータについては TABLE2 のデータも抽出する
- TABLE2 のみ存在するデータの行は抽出されない
- TABLE1 を基準にして表を作るイメージ
RIGHT JOIN
クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 RIGHT JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY
- TABLE2 のデータは全件表示し、ON~ の条件で結合したデータについては TABLE1 のデータも抽出する
- TABLE1 のみ存在するデータの行は抽出されない
- TABLE2 を基準にして表を作るイメージ
- LEFT JOIN とは表示の基準が逆になる
FULL JOIN
クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 FULL JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY
- TABLE1,TABLE2 のデータをどちらも全件表示し、ON~ の条件で結合したデータについては同一行でデータを抽出する
- TABLE1 もしくは TABLE2 のみ存在するデータも抽出される
- LEFT JOIN と RIGHT JOIN を合わせて、重複を削除すると FULL JOIN で抽出する内容と同じになる
- 目標データと実績データのテーブルを結合した際に、目標もしくは実績データのみのデータも落とさずに表示したいときに使った
TABLE1(目標データ)
KEY | TARGET |
---|---|
A | 100 |
B | 50 |
C | 80 |
TABLE2(実績データ)
KEY | RESULT |
---|---|
A | 200 |
B | 100 |
D | 150 |
FULL JOINでの結合後(KEYを結合キーとして利用)
KEY | TARGET | RESULT |
---|---|---|
A | 200 | 200 |
B | 50 | 100 |
C | 80 | |
D | 150 |
CROSS JOIN
クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 CROSS JOIN TABLE2
- TABLE1,TABLE2 の組み合わせたデータを全通り抽出する
- 表示されるデータ数は (TABLE1 のデータ数) × (TABLE2 のデータ数)
- 基準となる指標ごとに実データを利用して算出を行っていくための準備としてデータと指標の組み合わせを抽出する時に使った
TABLE1(指標)
BASE |
---|
目標 |
実績 |
達成率 |
TABLE2(実データ)
KEY | TARGET | RESULT |
---|---|---|
A | 200 | 200 |
B | 50 | 100 |
CROSS JOINでの結合後
BASE | KEY | TARGET | RESULT |
---|---|---|---|
目標 | A | 200 | 200 |
目標 | B | 50 | 100 |
実績 | A | 200 | 200 |
実績 | B | 50 | 100 |
達成率 | A | 200 | 200 |
達成率 | B | 50 | 100 |
まとめ
個人的にはCROSS JOIN や FULL JOIN の使いどころはあまりないのかと思ってたけど、
業務の中で使う機会が出てきたことに驚きがあったので、メモしておこうと思いました。
もしかしたら、使わずにすむ最善の方法があったのかもしれないけど。。。