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
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas supprimer des lignes qui n'ont pas été mis à jour par la commande merge.
Voici de la documentation: http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm
Qui signifie, que les lignes doit être mis à jour. Hovewer, vous n'avez pas besoin de mettre à jour toutes les lignes, après mise à JOUR, utilisez la même clause where que vous utilisez après SUPPRIMER
OriginalL'auteur krokodilko
J'ai trouvé, vous pourrez définir la colonne à lui-même:
Cela supprime le besoin pour le mannequin de la colonne.
Qui est correct. Par la documentation d'oracle vous ne pouvez pas mettre à jour une colonne qui fait partie de la clause. Si vous pensez à ce sujet, cela fait sens. Mais vous pouvez utiliser un autre Non-dummy de la colonne dans la mise à jour; sans l'avoir essayé je ne sais pas si la suppression de la clause serait encore de déclencher la même erreur? E. g. ENSEMBLE b_value = b_value où a_value pas dans ('as', "afk") biffer les a_value pas dans ('as', "afk").
OriginalL'auteur datico