将Oracle Merge转换为MySQL更新

时间:2019-01-14 20:03:57

标签: java mysql oracle merge

我正在尝试将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 :(得分:0)

如您所述,原始Oracle MERGE语句仅执行更新,不执行插入操作。

与Oracle版本相比,MySQL查询的一般语法看起来不错。这是更新的版本:

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日期的默认格式,因此您不需要转换它,您可以按原样传递它(注意:'formatter.form(dWV.getTime())'实际含义是- NB2:如果您需要翻译字符串至今,STR_TO_DATE是您的朋友)

  • a上的过滤条件最好放在WHERE子句中,而表b上的过滤条件最好属于INNER JOIN