有没有一种方法可以使用oracle merge插入和删除而不是更新?
我有一个表,代表与另一个表中的单个行相关的一组值。我可以通过删除所有值并重新添加新值集,或有选择地删除一些值并添加其他值来更改值的集合,但是如果可能的话,我希望将其设置为一条语句。
这是一个带有更新的工作示例。为了使此工作有效,我必须添加dummy一个列,以便可以更新不在此on条件中的列。有什么方法可以仅删除和插入而无需更新虚拟列吗?
dummy
on
该on条件中的任何列都可能update set不在列表中,即使它没有实际更新也是如此。
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中进行了尝试。
不可以,您不能删除未通过merge命令更新的行。 这是文档:http : //docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm
指定DELETE where_clause以在填充或更新表时清理表中的数据。 受此子句影响的唯一行是目标表中由合并操作更新的行 。DELETE WHERE条件将评估更新的值,而不是由UPDATE SET … WHERE条件评估的原始值。如果目标表的行满足DELETE条件,但未包含在ON子句定义的联接中,则不会删除它。对于每行删除,将激活目标表上定义的所有删除触发器。
这意味着 必须 更新行。但是,您不需要更新所有行,在UPDATE之后使用与在DELETE之后使用的相同的WHERE子句
when matched then update set dummy=dummy where a_value not in ('ace','afk') delete where a_value not in ('ace','afk')