Oracle fusion sql pour insérer et supprimer mais pas de mise à jour

Est-il un moyen pour utiliser oracle fusion et d'insérer et de supprimer mais pas de mise à jour?

J'ai un tableau représentant un ensemble de valeurs liées à une seule ligne dans une autre table. J'ai pu modifier le jeu de valeurs par la suppression de tous et en ajoutant le nouvel ensemble, ou de manière sélective la suppression de certains et d'en ajouter d'autres, mais je suis intéressé à en faire une seule déclaration, si possible.

Voici un exemple de travail avec la mise à jour. Afin de rendre ce travail, j'ai dû ajouter dummy ainsi que d'une colonne pour la mise à jour qui n'était pas dans le on condition. Est-il possible de seulement supprimer et insérer sans un mannequin de la colonne à mettre à jour?

Pas de colonne à partir de la on condition peut être dans le update set liste même si elle n'est pas effectivement mis à jour.

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;

J'ai essayé ceci dans oracle 10g et, avec cette sqlfiddle, oracle 11g.

OriginalL'auteur drawnonward | 2013-07-17