JOINにはINNER JOINとOUTER JOINがあります。さらに、OUTER JOINにはLEFT OUTER JOINとRIGHT OUTER JOINの2種類があります。例えばtableAとtableBを表1、2とすると、LEFT OUTER JOINとRIGHT OUTER JOINのSQL文および結果は以下のようになります。
tableA |
col01 |
col02 |
1 |
A1 |
2 |
A2 |
表1:tableAの中身
tableB |
col01 |
col02 |
2 |
B2 |
3 |
B3 |
表2:tableBの中身
LEFT OUTER JOINの例
select a.col01,a.col02,b.col03 from tableA a LEFT OUTER JOIN tableB b on a.col01 =b.col01;
1 | A1 | null
2 | A2 | B2
RIGHT OUTER JOINの例
select a.col01,a.col02,b.col03 from tableA a RIGHT OUTER JOIN tableB b on a.col01 = b.col01;
2 | A2 | B2
null | null | B3
このLEFT OUTER JOINとRIGHT OUTER JOINの動作はPostgreSQL、MySQLともに同じです。
PostgreSQLの場合は、LEFT OUTER JOINとRIGHT OUTER JOINの両方の処理を同時に行うようなFULL OUTER JOINがサポートされています。同様に、tableAとtableBでFULL OUTER JOINを行うと以下のような実行結果になります。これは、MySQLでは実行できません。
FULL OUTER JOINの例
select a.col01,a.col02,b.col03 from tableA a FULL OUTER JOIN tableB b on a.col01 = b.col01;
1 | A1 | null
2 | A2 | B2
null | null | B3
MySQLにてPostgreSQLのFULL OUTER JOINと同じ結果を得るためには、LEFT OUTER JOINとRIGHT OUTER JOINのSELECT文をUNIONにて結合するなどの工夫が必要になります。以下は、UNIONを用いてFULL OUTER JOINと同じ結果をだす例です。
(select a.col01,col02,col03 from tableA a LEFT OUTER JOIN tableB b on a.col01 = b.col01) union distinct (select a.col01,col02,col03 from tableA a RIGHT OUTER JOIN tableB b on a.col01 = b.col01);
1 | A1 | null
2 | A2 | B2
null | null | B3
もちろん、PostgreSQLでもこのUNIONを用いたJOINは動作します。
|