Oracleでは、(一部の)ビューまたはサブクエリでDMLを実行できます。ガイドラインは、Oracleがビューから物理行を取得できる場合、ビューは更新可能であるということです。
したがって、サブクエリでMERGEを使用できます。場合によっては意味があります。たとえば、ステータス列のあるテーブルがあるとします。新しい情報をこのテーブルにマージしますが、を含む行のみを変更しますSTATUS='active'
。あなたは書くことができます:
MERGE INTO (SELECT * FROM mytable WHERE status='active') old
USING (SELECT * FROM newtable) new
ON (new.id = old.id)
WHEN MATCHED THEN UPDATE SET old.data1=new.data1;
編集
これにより、ORA-00903
9iR2が生成されるようです。ただし、11gで動作します。テストスクリプト:
create table t (id number, c varchar2(10));
insert into t (select rownum, 'aaa' from dual connect by level <= 1000);
merge into (select * from t where id <= 10) t
using (select 1 id from dual) d
ON (t.id = d.id)
when matched then update set c = 'iii';