MySQLで、OracleのSQLと同じ結果を取得する1
山岸賢治 [著] 2009/05/28 14:00

SourceCode 2.59 KB

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

1 2 3 →

はじめに

 「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
PKeyVal
12
2null
3null
48
TBL2
PKeyVal
12
2null
35
49

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

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

 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のイメージ

1 2 3
→
INDEX
MySQLでOracleのSQLを模倣1 (集合演算編)
Page1
はじめに
対象読者
必要な環境
1. minus
2. intersect
3. 完全外部結合
4. パーティション化された外部結合
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

Oracle ACEの1人。
OracleSQLパズルの運営者。
ORACLE MASTER Silver Oracle Database 10g
(研修受講で)ORACLE MASTER Gold Oracle Database 10g
ソフトウェア開発技術者 (情報処理技術者試験)
第二種情報処理技術者 (情報処理技術者試験)
 


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト