![]()
SQLクリニック(11) Page
2/2IF文のネスト地獄から抜け出せるMERGE文
株式会社インサイトテクノロジー
林 優
2005/12/27
では、いよいよ変更文をEMP表に反映させます。
[merge.sql] |
| リスト5 EMP_UPDATE表の変更をEMP表に反映 |
では、反映されたEMP表を参照してみましょう
SQL> select * from emp where empno = 7654 or empno = 9999; |
| リスト6 EMP表の変更を確認 |
ということで、EMP_UPDATE表の変更をEMP表に反映させることができました。これを使えば、SELECT文を実行してデータがあればUPDATE、なければINSERTというロジックをわざわざ書かなくてもいいですし、2度のSQL文が1回で済むのでメンテナンスも楽チンですねぇ。
「いやいや、ちょっと待て! EMPNOのUPDATEは???」と思った方は鋭いですね。では、上記と同じ文でUPDATE句の部分に「e.empno = u.empno」を追加して実行してみます。
SQL> @merge |
| リスト7 「e.empno = u.empno」を追加した際のエラー |
実は、ON句で指定している項目はUPDATEすることができないのです。MERGE文でUPDATEできるのは、ON句で参照していない列に限られるという制限があるためです。結合キーが変更されてしまうのは、困る! というわけです。上記の点には注意してくださいね。
MERGE文では表のデータを使わなきゃダメ? と思う方も多いと思います。SQL*Plusから直接データを打ち込んでMERGE文を使うのに、ワザワザ表を作るのはちょっとコストが高いかなぁ……と思うこともあります。
そんなときは、SubQueryを使用します。USING句の指定する行ソースを、SubQueryで抽出した表にして、抽出した結果と該当の表と結合させます。
[merge2.sql] |
| リスト8 SubQueryを使用したMERGE文 |
では、確認してみましょう
SQL> select * from emp where empno = 9999; |
| リスト9 EMP表の変更を確認 |
ちゃんと、Cons部に異動して、給料も20円(ドル?)になりました。
◇
MERGE文にはCASE文も含めることができるので、プロシージャの中でIF文を多用する場合よりも、すっきりとしたコーディングにできると思いますよ。ただし、このMERGE文……便利なんですが、いくつかBugが報告されているようです。Patchを適用したり、オラクル社のサポート情報もチェックして十分なテストとともに実装してみてください。(次回に続く)
| 筆者プロフィール |
| 株式会社インサイトテクノロジー Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。林 優は殺伐とした対策現場でも柔らかな言動で問題点を切り分ける誠実な目の中に闘志を持つシステムコンサルタント。 |
| 2/2 |
| Index | |
| 連載 SQLクリニック(11) IF文のネスト地獄から抜け出せるMERGE文 |
|
| Page 1 ・MERGE文の正体を知ろう ・MERGE文を使ったサンプルの準備 |
|
| Page 2 ・MERGE文を使ったサンプルの実行 ・データをそのまま使う |
|
| SQLクリニック |
TechTargetジャパン
- IBMが歴史を変える!? 新カテゴリの製品を発表 (2012/5/25)
IBMは新たな製品カテゴリとなる「PureSystems」を発表。DB2 10とビッグデータの関係、PureSytemsの斬新さはどこかに迫ります - クラウド時代のデータ処理を支える分散KVSの可能性 (2012/5/23)
現在、高速データ処理の主流はインメモリ型データ処理だが、別の方法として分散KVSが注目を集めている。今回は分散KVSについて話を聞いた - 複数の表からデータを取り出して表示させる(2) (2012/4/23)
前回はSQLの基本的な結合構文について説明しました。今回は、より複雑な自己結合や外部結合について説明します - SQL Server、OOWにIQ、盛りだくさんの4月 (2012/4/20)
オラクルオープンワールドが3年ぶりに東京で開催されたほか、SQL Server 2012が提供開始されるなど、今月は話題が盛りだくさんです
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
