【问题标题】:convert mysql (on duplicate key ) query to oracle merge将 mysql(在重复键上)查询转换为 oracle 合并
【发布时间】:2018-12-05 22:37:57
【问题描述】:
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')

【问题讨论】:

    标签: mysql oracle oracle11g


    【解决方案1】:

    为此,您需要在using 子句中使用表或子查询(在您的情况下,您需要一个子查询)。

    在Oracle中,如果你需要选择一些东西而不需要从一个实际的表中选择,你可以使用双表;这是一个只包含单行单列的表。

    因此,您的合并语句应如下所示:

    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 的列中!)。

    我还切换了别名,以便更清楚地了解您在哪里合并;我发现这更容易理解合并语句在做什么。 YMMV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 2019-07-29
      • 2018-11-01
      • 2013-07-10
      • 2013-09-06
      • 2015-10-03
      • 2020-09-07
      • 2012-02-06
      相关资源
      最近更新 更多