トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

2-2-4 インラインビューを使用してmerge

SQLパズル

MergeTable
Col1  Col2
----  ----
   3  9999
9999  9999

MergeTableのCol1,Col2に、以下の3レコードを追加更新する。
レコード1(1,2)
レコード2(3,4)
レコード3(5,6)
MergeTableのプライマリキーは、Col1とする。

更新結果
MergeTable
Col1  Col2
----  ----
   1     2
   3     4
   5     6
9999  9999


データ作成スクリプト

create table MergeTable(Col1 primary key,Col2) as
select    3,9999 from dual union
select 9999,9999 from dual;


SQL

merge into MergeTable a
using (select 1 as Val1,2 as Val2 from dual
       union all select 3,4 from dual
       union all select 5,6 from dual) b
on (a.Col1=b.Val1)
when matched then
update set a.Col2=b.Val2
when not matched then
insert(a.Col1,a.Col2) values(b.Val1,b.Val2);


解説

mergeのデータソースにインラインビューを使えば、
インラインビューで作成した集合を、
1レコードごとに、直接insertもしくはupdateすることが可能となります。


10gのmerge文では、 ・when not matched then以降が省略可能(update文の別の記述方法といった用途があります) ・updateの後にdelete文を記述可能 といった拡張が行われています。 --■■■when not matched then以降を省略■■■ merge into MergeTable a using (select Col1 as Val1,max(Col2) over() as Val2 from MergeTable) b on (a.Col1=b.Val1) when matched then update set a.Col2=b.Val2; --■■■updateの後にdelete文■■■ merge into MergeTable a using (select Col1 as Val1,max(Col2) over() as Val2 from MergeTable) b on (a.Col1=b.Val1) when matched then update set a.Col2=b.Val2 delete where a.Col2 = 9999;

@IT IF文のネスト地獄から抜け出せるMERGE文
@ITハイブックス:OracleDBユーザーズガイド −9i & 10g 対応