Oracleのマージを使用して挿入および削除を行いますが、更新はできませんか?Oracle sqlのマージで挿入および削除が行われますが、更新はされません
私は、別のテーブルの1つの行に関連する一連の値を表すテーブルを持っています。値を変更するには、それらをすべて削除して新しいセットを追加するか、または選択的に削除して他のものを追加することで値のセットを変更できますが、可能であれば単一のステートメントにすることに興味があります。
ここには更新のある実例があります。この作業を行うために、dummy
を追加して、on
の条件にない列を更新できるようにしなければなりませんでした。更新するためにダミー列を削除せずに挿入するしかありませんか?
の条件の列は、実際には更新されていなくてもよい。
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;
私は、このsqlfiddleでは、Oracle 11gのOracle 10gのでこれをしようとしたしています。
ダミー列を持つよりも良い方法はないと確信していましたが、ダミー列を追加するつもりはありません。しかたがない。 – drawnonward