Конвертировать Oracle Merge в MySQL Update - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь преобразовать оператор Oracle MERGE в оператор MySQL Update. Этот конкретный оператор MERGE выполняет только обновление (без вставок), поэтому неясно, почему предыдущий инженер использовал оператор MERGE.

Несмотря на это, я знаю, что нужно конвертировать это в MySQL, и не ясно, как это сделать. (примечание: я делаю это в приложении JAVA)

Вот оператор MERGE:

MERGE INTO table1 a
 USING 
 (SELECT DISTINCT(ROWID) AS ROWID FROM table2 
 WHERE DATETIMEUTC >= TO_TIMESTAMP('
 formatter.format(dWV.getTime())
 ','YYYY-MM-DD HH24:MI:SS')) b
 ON(a.ROWID = b.ROWID and 
 a.STATE = 'WV' and a.LAST_DTE = trunc(SYSDATE)) 
 WHEN MATCHED THEN UPDATE SET a.THISIND = 'S';

Мои попытки выглядят примерно так:

UPDATE table1 a
INNER JOIN table2 b ON (a.ROWID = b.ROWID 
and a.STATE = 'WV' 
and a.LAST_DTE = date(sysdate()))
SET a.THISIND = 'S'
WHERE DATETIMEUTC >= TO_TIMESTAMP('formatter.form(dWV.getTime())', 'YYYY-MM-DD HH24:MI:SS')

Однако мне неясно, действительно ли это делает то же самое или нет?

1 Ответ

0 голосов
/ 14 января 2019

Как вы отметили, исходный оператор Oracle MERGE выполняет только обновления, но не вставки.

Общий синтаксис вашего запроса MySQL выглядит хорошо по сравнению с версией Oracle. Вот обновленная версия:

UPDATE table1 a
INNER JOIN table2 b 
    ON a.ROWID = b.ROWID 
    AND b.DATETIMEUTC >= 'formatter.form(dWV.getTime())'
SET a.THISIND = 'S'
WHERE 
    a.STATE = 'WV' 
    AND a.LAST_DTE = CURDATE()

Изменения:

  • текущую дату можно получить с помощью функции CURDATE()

  • 'YYYY-MM-DD HH24:MI:SS' является форматом по умолчанию для дат MySQL, поэтому вам не нужно преобразовывать его, вы можете просто передать его как есть (NB1: неясно, что на самом деле означает 'formatter.form(dWV.getTime())' - NB2: если вы когда-нибудь нужно перевести строку на сегодняшний день, STR_TO_DATE твой друг)

  • условия фильтрации в таблице a лучше размещать в предложении WHERE, а в таблице b лучше относиться к INNER JOIN

...