Gibt es eine Möglichkeit, Oracle Merge zum Einfügen und Löschen verwenden, aber nicht aktualisieren?Oracle-SQL-Merge zum Einfügen und Löschen, aber nicht aktualisieren
Ich habe eine Tabelle, die eine Reihe von Werten für eine einzelne Zeile in einer anderen Tabelle darstellt. Ich könnte die Menge der Werte ändern, indem ich sie alle lösche und die neue Menge hinzufüge, oder indem ich einige selektiv lösche und andere hinzufüge, aber ich bin daran interessiert, wenn möglich eine einzige Aussage zu machen.
Hier ist ein Arbeitsbeispiel mit Update. Damit dies funktioniert, musste ich dummy
hinzufügen, so dass eine Spalte zum Aktualisieren verfügbar war, die nicht im on
Zustand war. Gibt es eine Möglichkeit, nur zu löschen und einzufügen, ohne eine Dummy-Spalte zu aktualisieren?
Keine Spalte aus der on
-Bedingung möglicherweise in der update set
-Liste, auch wenn es nicht tatsächlich aktualisiert wird.
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;
Ich habe dies 10g in Oracle versucht, und mit diesem sqlfiddle, Oracle 11g.
Ich war ziemlich sicher, es gab keinen besseren Weg als eine Dummy-Spalte, aber ich werde nicht nur eine Dummy-Spalte hinzufügen. Naja. – drawnonward