テーブルの結合は、技術者であれば様々な局面で使用することが多いですが、少し間が空いてしまうと、忘れることが多い自分のために、まとめておこうかと。。
まず、例として以下のようなテーブルを用意。
CREATE TABLE 売上 ( "売上ROW_ID" NUMBER, "売上日" DATE, "顧客CD" VARCHAR2(4) ); CREATE TABLE 顧客 ( "顧客CD" VARCHAR2(4), "顧客名" VARCHAR2(255) );
各々のテーブルには以下のようにデータが入っていることにします。
【売上テーブル】
売上ROW_ID | 売上日 | 顧客CD |
1 | 13-01-01 | C001 |
2 | 13-02-01 | C002 |
3 | 13-03-01 | C003 |
4 | 13-04-01 | |
5 | 13-05-01 | TMP |
6 | 13-06-01 | C001 |
【顧客テーブル】
顧客CD | 顧客名 |
C001 | 田中さん |
C002 | 鈴木さん |
①INNER JOIN
select * from 売上 inner join 顧客 on (売上.顧客CD = 顧客.顧客CD)
INNER JOINは、結合する両方のテーブルに存在するレコードを取得します。
売上ROW_ID | 売上日 | 顧客CD | 顧客CD | 顧客名 |
1 | 13-01-01 | C001 | C001 | 田中さん |
2 | 13-02-01 | C002 | C002 | 鈴木さん |
6 | 13-06-01 | C001 | C001 | 田中さん |
②LEFT OUTER JOIN
select * from 売上 left outer join 顧客 on (売上.顧客CD = 顧客.顧客CD)
LEFT OUTER JOINは、左のテーブルのレコードを全て抽出したうえで、結合条件にしたがって、右の表のレコードを結合していきます。このとき、結合できない場合は、NULLとなります。
売上ROW_ID | 売上日 | 顧客CD | 顧客CD | 顧客名 |
1 | 13-01-01 | C001 | C001 | 田中さん |
2 | 13-02-01 | C002 | C002 | 鈴木さん |
3 | 13-03-01 | C003 | NULL | NULL |
4 | 13-04-01 | NULL | NULL | NULL |
5 | 13-05-01 | TMP | NULL | NULL |
6 | 13-06-01 | C001 | C001 | 田中さん |
③RIGHT OUTER JOIN
select * from 売上 right outer join 顧客 on (売上.顧客CD = 顧客.顧客CD)
RIGHT OUTER JOINは、右のテーブルのレコードを全て抽出したうえで、結合条件にしたがって、左の表のレコードを結合していきます。このとき、結合できない場合は、NULLとなります。
下の結果で少し注意したいのは、売上テーブルには、「C001」という顧客CDをもつレコードが2件あるため、結果の行数も全3件になっていることです。
売上ROW_ID | 売上日 | 顧客CD | 顧客CD | 顧客名 |
1 | 13-01-01 | C001 | C001 | 田中さん |
2 | 13-02-01 | C002 | C002 | 鈴木さん |
6 | 13-06-01 | C001 | C001 | 田中さん |
自分の覚え方
上記を見ても分かるように、OUTER JOINのLEFT、RIGHTは、どちらのテーブルを基準にするかを指定しています。
①「select * from 基準のテーブル」 で基準テーブルのレコードを全件抽出する。 ⇒外部表(OUTER)、駆動表 { LOOP { ②上記で抽出したレコードに対して、結合条件に合致するレコードを もう1つのテーブルから取得していく } END LOOP } |
のようになっているとイメージすると良いです。
つまり、①で、LOOPの外側(OUTER)となっているテーブルが基準となり、それを指定しているのがLEFTの方なのか、RIGHTの方なのかというわけです。
そのため、①の方のテーブルを「外部表」と言ったり、「駆動表」と呼んだりします。