我正在尝试将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')
但是,我不清楚这是否实际上在做同一件事?
答案 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