小编典典

Oracle SQL合并以插入和删除但不更新

sql

有没有一种方法可以使用oracle merge插入和删除而不是更新?

我有一个表,代表与另一个表中的单个行相关的一组值。我可以通过删除所有值并重新添加新值集,或有选择地删除一些值并添加其他值来更改值的集合,但是如果可能的话,我希望将其设置为一条语句。

这是一个带有更新的工作示例。为了使此工作有效,我必须添加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中进行了尝试。


阅读 224

收藏
2021-03-17

共1个答案

小编典典

不可以,您不能删除未通过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')
2021-03-17