преобразовать MySQL (на дубликате ключа) запрос в оракула слияния

0
INSERT INTO table1(id,dept_id,name,description,creation_time,modified_time) 
VALUES('id','dept_id','name','description','creation_time','modified_time') 
ON DUPLICATE KEY UPDATE dept_id=VALUES(dept_id),name=VALUES(name),
   description=VALUES(description),creation_time=VALUES(creation_time),
   modified_time=VALUES(modified_time)

Я использовал приведенный ниже оракул для преобразования вышеупомянутого запроса mysql. Запрос завершается с ошибкой. Не могли бы вы помочь мне выяснить, что не так с запросом оракула.

Merge into table1 t1 using 
    (VALUES ('id','dept_id','name','description','creation_time','modified_time')) as temp 
    (id,dept_id,name,description,creation_time,modified_time) on t1. id = temp.id 
WHEN MATCHED THEN UPDATE SET dept_id=t1.dept_id, description=t1.description, name=t1.name, 
    creation_time=t1.creation_time, modified_time=t1.modified_time 
WHEN NOT MATCHED THEN INSERT (id,dept_id,name,description,creation_time,modified_time) 
VALUES ('id','dept_id','name','description','creation_time','modified_time')
Теги:
oracle11g

1 ответ

0
Лучший ответ

Для этого необходимо использовать таблицу или подзапрос в using пункта (в вашем случае, вам нужен подзапрос).

В Oracle вы можете использовать двойную таблицу, если вам нужно выбрать что-то, без необходимости выбирать из фактической таблицы; это таблица, содержащая только одну строку и один столбец.

Поэтому выражение о слиянии должно выглядеть примерно так:

MERGE INTO table1 tgt
USING (SELECT 'id' id,
          'dept_id' dept_id,
          'name' NAME,
          'description' description,
          'creation_time' creation_time,
          'modified_time' modified_time
     FROM   dual) src
ON tgt.id = src.id
WHEN MATCHED THEN
  UPDATE
  SET  tgt.dept_id       = src.dept_id,
       tgt.description   = src.description,
       tgt.name          = src.name,
       tgt.creation_time = src.creation_time,
       tgt.modified_time = src.modified_time
WHEN NOT MATCHED THEN
  INSERT
    (tgt.id,
     tgt.dept_id,
     tgt.name,
     tgt.description,
     tgt.creation_time,
     tgt.modified_time)
  VALUES
    (src.id,
     src.dept_id,
     src.name,
     src.description,
     src.creation_time,
     src.modified_time);

Обратите внимание, что в when not matched, использует столбцы из исходного подзапроса, вместо того, чтобы использовать введенные значения букв. (Я предполагаю, что в вашем фактическом коде эти буквальные значения являются фактически переменными; creation_time - довольно странное значение для хранения в столбце с меткой create_time!).

Я также переключил псевдонимы, чтобы сделать их более ясными, где вы сливаетесь в и из; Я нахожу, что это упрощает понимание того, что делает оператор слияния. YMMV.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню