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

时间:2018-06-27 06:26:43

标签: mysql oracle oracle11g

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

1 个答案:

答案 0 :(得分:0)

为此,您需要在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_time的列中!)

我还切换了别名,以使您在与之合并的地方更清楚;我发现这使您更容易理解merge语句在做什么。 YMMV。