将mysql(在重复键上)查询转换为oracle merge

yyyllmsg  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(278)
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)

我使用下面的oracle来转换上面的mysql查询。查询失败。你能帮我找出oracle查询有什么问题吗。

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')
xxslljrj

xxslljrj1#

为此,需要在 using 子句(在您的情况下,需要一个子查询)。
在oracle中,如果您需要选择一些内容,而不需要从实际的表中进行选择,则可以使用双表;这是一个只包含一行和一列的表。
因此,您的merge语句应该如下所示:

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\u time!的列中存储一个非常奇怪的值。
我还切换了别名,以便更清楚地显示合并的位置;我发现这样更容易理解merge语句在做什么。基督教青年会。

相关问题