SHOEISHA iD

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

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

MySQLでOracleのSQLを模倣する

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード SourceCode (2.5 KB)

 「MySQLで分析関数を模倣」シリーズに続いて、MySQLでOracleのSQLを模倣する方法を紹介したいと思います。本稿では、minus、intersect、完全外部結合、パーティション化された外部結合と同じ結果を取得するSQLを扱います。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 「MySQLで分析関数を模倣」シリーズに続いて、MySQLでOracleのSQLを模倣する方法を紹介したいと思います。本稿では、minusintersect、完全外部結合、パーティション化された外部結合と同じ結果を取得するSQLを扱います。

対象読者

  • MySQLで、OracleのSQLと同じ結果を取得するSQLを書きたい方
  • OracleのSQLの理解を深めたい方

必要な環境

 本稿で扱うSQLは、MySQL 5.1.28で動作確認しました。ソースコードはOracle 10.2.0.1.0でも動作確認しました。その他、次の環境でも応用が可能です。

  • PostgreSQL
  • SQL Server
  • DB2

1. minus

 minusは、差集合演算を行います。Oracle以外のデータベースでは、exceptで実装されています(標準SQLでexceptとして定義されているため)。

 MySQLで同じ結果を取得してみましょう。まずは、テーブルのデータと、出力結果を考えます。

TBL1
PKey Val
1 2
2 null
3 null
4 8
TBL2
PKey Val
1 2
2 null
3 5
4 9

 TBL1に存在して、TBL2に存在しない行を出力します。言いかえれば、Oracleの下記のminusを使ったSQLと同じ結果を取得します。

minusを使ったSQL
select PKey,Val from TBL1 minus
select PKey,Val from TBL2;
出力結果
PKey Val
3 null
4 8

 TBL1に存在して、TBL2に存在しない行を出力するので、exists述語を使えばいいと考え、答えは下記となります。

exists述語を使う方法
select PKey,Val
  from TBL1 a
 where not exists(select 1 from TBL2 b
                   where b.PKey <=> a.PKey
                     and b.Val  <=> a.Val);

 exists述語を使う方法の、SQLのイメージは下記です。

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

 別の考え方として、下記のようにunion allgroup byを使う方法もあります。

union allとgroup byを使う方法
select PKey,Val
from (select 1 as ID,PKey,Val from TBL1 union all
      select 2 as ID,PKey,Val from TBL2) a
group by PKey,Val
having max(ID) = 1;

 union allgroup byを使う方法の、SQLのイメージは下記です。

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

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
2. intersect

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
この記事の著者

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3906 2009/05/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング