検索
連載

IF文のネスト地獄から抜け出せるMERGE文SQLクリニック(11)(1/2 ページ)

PC用表示
Share
Tweet
LINE
Hatena

本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)

IF ... THEN

   IF ... THEN

        IF ... THEN

            IF ... THEN

                IF ...

というように、IF文がネストし過ぎていて「もし?で、もし?で、もし?で、もし?だったら、こうする」なんていう、メルヘンチックなプロシージャがたまにあります。ELSE文でも入ろうものなら、不思議な国に突入することもシバシバ……。

 そんな条件分岐を少しでも減らせるかもしれない、Oracle9iから追加されたMERGE文をご紹介します。

 まだアプリケーションで使用されている方にはあまりお目にかかれませんが、Oracle 10gのmmon(Memory Monitor)では、内部的にMERGE文を使用していたりします。

MERGE文の正体を知ろう

 では、このMERGE文、一体どういうものなのか? を先に説明します。調べてみると……、

「1つ以上のソースから行を選択し、1つ以上の表に対して更新および挿入できます。対象となる表に対して更新と挿入のどちらを実行するかを決定する条件を指定できます」

と書いてあります(「Oracle Database SQL リファレンス 9i/10g」より抜粋)。

 簡単にいうと、INSERT ? SELECTの際に「INSERT先のテーブルにINSERT/UPDATEすることができて、条件を指定できちゃうよ」っていう、気が利くDDL文です。

MERGE文を使ったサンプルの準備

 では、具体的にサンプルを用いて見ていきましょう。皆さまご存じのEMP表(いまさらですが……SCOTTスキーマは、SQL*Plusから「@?/rdbms/admin/utlsampl.sql」を実行して作成できます)を使用します。

 EMP_UPDATE表をEMP表と同じように作成します。

SQL> create table emp_update as
  2  select * from emp where 1 = 0;
Table created.
リスト1 EMP表をコピーしてEMP_UPDATE表を作成

 WHERE句の「1=0」という指定は、データまでEMP_UPDATE表に挿入する必要がないからです。枠だけコピーしたい場合は、意外と重宝します。

 では、EMP表にあるMARTINさんのデータを見てみます。

SQL> select * from emp where ename = 'MARTIN';
     EMPNO ENAME      JOB          MGR HIREDATE     SAL  COMM  DEPTNO
---------- ---------- --------- ------ ---------- ----- ----- -------
      7654 MARTIN     SALESMAN  7698   28-SEP-81   1250  1400      30
リスト2 MARTINのデータを確認

 リスト2がMARTINさんのデータです。では、作成したEMP_UPDATE表にMARTINさんを以下のデータでINSERTします。

insert into emp_update values (
  '7654',
  'MARTIN',
  'ANALYST',
  '7566',
  to_date('1981/9/28','YYYY/MM/DD'),
  '3000',
  null,
  20
);
リスト3 EMP_UPDATE表にMARTINのデータをINSERT

 ついでに、新入社員のHAYASHIさんもSALESMANとして登録しましょう。

insert into emp_update values (
  '9999','HAYASHI','SALESMAN','7698',sysdate,'10',null,30
);
リスト4 EMP_UPDATE表にHAYASHIのデータをINSERT

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る