我正在尝试将 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')
但是,我不清楚这是否实际上在做同样的事情?
最佳答案
正如您所指出的,原始 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 日期的默认格式,因此您不需要转换它,您可以按原样传递它( NB1:不清楚'formatter.form(dWV.getTime())'
的实际含义 - NB2:如果您需要将字符串翻译为日期,STR_TO_DATE
是你的 friend )表
a
上的过滤条件最好放在WHERE
子句中,而表b
上的过滤条件最好放在WHERE
子句中内部连接
关于java - 将 Oracle 合并转换为 MySQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54188400/