4. パーティション化された外部結合
Oracle10gから使用可能になった、パーティション化された外部結合です。Partitioned Outer Joinとも呼ばれます。MySQLで同じ結果を取得してみましょう。まずは、テーブルのデータと、出力結果を考えます。
| ID | Seq | Val |
| A | 1 | aaa |
| A | 2 | bbb |
| A | 3 | ccc |
| B | 1 | ddd |
| B | 2 | eee |
| C | 3 | fff |
| D | 1 | ggg |
| D | 2 | hhh |
IDごとで、Seqが1,2,3のレコードがなかったら、Valをnullとして補完します。言いかえれば、Oracleの下記のパーティション化された外部結合を使ったSQLと同じ結果を取得します。
select b.ID,a.Seq,b.Val
from (select 1 as Seq from dual union all
select 2 as Seq from dual union all
select 3 as Seq from dual) a
Left Outer Join POuter b
partition by(b.ID)
on (a.Seq = b.Seq)
order by b.ID,a.Seq;
| ID | Seq | Val |
| A | 1 | aaa |
| A | 2 | bbb |
| A | 3 | ccc |
| B | 1 | ddd |
| B | 2 | eee |
| B | 3 | null |
| C | 1 | null |
| C | 2 | null |
| C | 3 | fff |
| D | 1 | ggg |
| D | 2 | hhh |
| D | 3 | null |
答えは、下記となります。
select a.ID,b.Seq,c.Val
from (select distinct ID from POuter) a
cross Join (select 1 as Seq union all
select 2 as Seq union all
select 3 as Seq) b
Left Join POuter c
on (a.ID = c.ID
and b.Seq = c.Seq)
order by a.ID,b.Seq;
解説すると、(select distinct ID from POuter)でIDを列挙して、次にクロスジョインでIDとSeqのすべての組み合わせを求めています。そして、Left Joinで外部結合して、欲しい結果を作成しています。SQLのイメージは下記です。

最後に
今回は、MySQLでOracleの集合演算と同じ結果を取得するSQLを扱いました。次回は、OracleでPostgreSQLのSQLと同じ結果を取得するSQLを扱う予定です。
参考資料
MySQL 5.1 リファレンスマニュアル 『11.1.3 比較関数と演算子』
<=>演算子 の説明が掲載されています。