Oracleマージを使用して挿入および削除するが更新しない方法はありますか?
別のテーブルの 1 つの行に関連する一連の値を表すテーブルがあります。値をすべて削除して新しいセットを追加し直すか、一部を選択的に削除して他の値を追加することで、値のセットを変更できますが、可能であれば単一のステートメントにすることに興味があります。
これは、更新を使用した実際の例です。これを機能させるには、条件dummy
にない列を更新できるように追加する必要がありました。on
ダミー列を更新せずに削除と挿入のみを行う方法はありますか?
実際に更新されていなくても、on
条件の列がリストにない場合があります。update set
create table every_value ( the_value varchar2(32) );
create table paired_value ( the_id number, a_value varchar2(32) , dummy number default 0 );
-- the_id is a foreign_key to a row in another table
insert into every_value ( the_value ) values ( 'aaa' );
insert into every_value ( the_value ) values ( 'abc' );
insert into every_value ( the_value ) values ( 'ace' );
insert into every_value ( the_value ) values ( 'adg' );
insert into every_value ( the_value ) values ( 'aei' );
insert into every_value ( the_value ) values ( 'afk' );
-- pair ace and afk with id 3
merge into paired_value p using every_value e
on ( p.the_id = 3 and p.a_value = e.the_value )
when matched then update set dummy=dummy+1
delete where a_value not in ('ace','afk')
when not matched then insert (the_id,a_value)
values (3,e.the_value)
where e.the_value in ('ace','afk');
-- pair ace and aei with id 3
-- should remove afk, add aei, do nothing with ace
merge into paired_value p using every_value e
on ( p.the_id = 3 and p.a_value = e.the_value )
when matched then update set dummy = dummy+1
delete where a_value not in ('ace','aei')
when not matched then insert (the_id,a_value)
values (3,e.the_value)
where e.the_value in ('ace','aei');
-- pair aaa and adg with id 4
merge into paired_value p using every_value e
on ( p.the_id = 4 and p.a_value = e.the_value )
when matched then update set dummy = dummy+1
delete where a_value not in ('aaa','adg')
when not matched then insert (the_id,a_value)
values (4,e.the_value)
where e.the_value in ('aaa','adg');
select * from paired_value;
私は oracle 10g でこれを試しました。このsqlfiddleで oracle 11g を試しました。