Как сделать UPSERT - обновить или вставить запись в таблицу?
Есть таблица:
monitored_tablespaces (
tablespace_name PK not null,
component_type not null,
fqdn not null,
inventory_name)
Необходимо в ОДНОМ запросе, либо добавлять новую таблицу в список по tablespace_name, либо, если такое имя таблицы уже есть, обновлять в ней данные.
Пробовал с MERGE, но пока не понимаю реализации.
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Всё очень просто. Источник записей помещается в USING. Если найдётся в целевой таблице запись по условию в ON, то она обновится, в противном случае - добавится новая запись.
create table item (
name varchar2 (16) primary key,
type varchar2 (8) not null,
memo varchar2 (32))
/
merge into item t using (
select
'name1' name, 'type1' type, 'memo1' memo
from dual) s on (s.name = t.name)
when matched then update set t.memo = 'updated '||s.memo
when not matched then insert values (s.name, s.type, s.memo)
/
Выпонив два раза вышеуказанный запрос, посмотрите, как меняется результат:
NAME TYPE MEMO
-------- -------- --------------------------------
name1 type1 memo1
NAME TYPE MEMO
-------- -------- --------------------------------
name1 type1 updated memo1
Если осталось что-то непонятным, измените подготовленный фиддле и оставте комментарий с обновлённой ссылкой.