トップページに戻る
次の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文