Czy istnieje sposób użycia Oracle scalania do wstawiania i usuwania, ale nie aktualizacji?Oracle sql scalić, aby wstawić i usunąć, ale nie aktualizować
Mam tabelę reprezentującą zestaw wartości związanych z jednym wierszem w innej tabela. Mógłbym zmienić zestaw wartości, kasując je wszystkie i dodając nowy zestaw, lub selektywnie usuwając niektóre i dodając inne, ale jestem zainteresowany złożeniem pojedynczego wyciągu, jeśli to możliwe.
Oto działający przykład z aktualizacją. Aby to działało, musiałem dodać dummy
, aby kolumna była dostępna do aktualizacji, która nie była w stanie on
. Czy jest jakiś sposób, aby usunąć i wstawić bez atrapa kolumna do aktualizacji?
Żadna kolumna z warunku on
nie może znajdować się na liście update set
, nawet jeśli nie została faktycznie zaktualizowana.
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;
Próbowałem to w Oracle 10g, a wraz z tym sqlfiddle, Oracle 11g.
Byłem dość pewny, że nie było lepszego sposobu niż posiadanie kolumny manekinowej, ale nie zamierzam dodawać kolumny manekinowej tylko po to. No cóż. – drawnonward