SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MySQLでOracleのSQLを模倣する

MySQLでOracleのSQLを模倣1
(集合演算編)

MySQLで、OracleのSQLと同じ結果を取得する1

ダウンロード SourceCode (2.5 KB)

4. パーティション化された外部結合

 Oracle10gから使用可能になった、パーティション化された外部結合です。Partitioned Outer Joinとも呼ばれます。MySQLで同じ結果を取得してみましょう。まずは、テーブルのデータと、出力結果を考えます。

POuter
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と同じ結果を取得します。

パーティション化された外部結合を使った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のイメージは下記です。

SQLのイメージ
SQLのイメージ

最後に

 今回は、MySQLでOracleの集合演算と同じ結果を取得するSQLを扱いました。次回は、OracleでPostgreSQLのSQLと同じ結果を取得するSQLを扱う予定です。

参考資料

MySQL 5.1 リファレンスマニュアル 『11.1.3 比較関数と演算子

MySQLのマニュアルです。本稿で使用した、<=>演算子 の説明が掲載されています。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3906 2009/05/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー