本連載は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.
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さんのデータです。では、作成したEMP_UPDATE表にMARTINさんを以下のデータでINSERTします。
insert into emp_update values ( '7654', 'MARTIN', 'ANALYST', '7566', to_date('1981/9/28','YYYY/MM/DD'), '3000', null, 20 );
ついでに、新入社員のHAYASHIさんもSALESMANとして登録しましょう。
insert into emp_update values ( '9999','HAYASHI','SALESMAN','7698',sysdate,'10',null,30 );
Copyright © ITmedia, Inc. All Rights Reserved.