преобразовать MySQL (на дубликате ключа) запрос в оракула слияния - PullRequest
0 голосов
/ 27 июня 2018
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')

1 Ответ

0 голосов
/ 27 июня 2018

Для этого вам нужно использовать таблицу или подзапрос в предложении 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 - довольно странное значение для хранения в столбце с именем creation_time!).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...