MERGE 表,匹配时不执行任何操作

2023-11-22

我有一张桌子DOMAINS在 2 个不同的列模式中ID, NAME,CODE,DESCRIPTION.

For any NAME存在于新模式中,它应该使用现有的ID没有任何合并;对于那些新的NAME记录,它应该插入ID来自旧模式。

MERGE INTO domains a
     USING ( SELECT id, name, code, description 
               FROM <Old Schema 6.1>.domains@db_mig_61_to_74 ) b
        ON ( a.name = b.name )
      WHEN MATCHED **<do nothing>**
      WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description ) 
                            VALUES( b.id, b.name, b.code, b.description );

我该如何解释这部分do nothing在上面的查询中?


对于您的情况,无需使用该部分:

WHEN MATCHED THEN UPDATE ...

( using WHEN MATCHED THEN UPDATE SET a.id = a.id被接受(Oracle 不会投掷)但没有任何影响,因此,这种用法是多余的,因为您不想为匹配的情况更改任何内容。 )

如果您想更改,请添加

WHEN MATCHED THEN UPDATE SET a.id = b.id

before WHEN NOT MATCHED THEN INSERT...

( 例如Oracle支持WHEN MATCHED THEN UPDATE句法。参考the Demo below )

针对当前案例继续执行以下操作:

SQL> CREATE TABLE domains( 
                           id          INT, 
                           name        VARCHAR2(50), 
                           code        VARCHAR2(50), 
                           description VARCHAR2(50)
                         );

SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');

SQL> MERGE INTO domains a USING 
     (SELECT 2 id, 'Domain A' name, 'D.A.' code, 'This is Domain A' description 
        FROM domains) b
          ON ( a.name = b.name )
        WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description ) 
                              VALUES( b.id, b.name, b.code, b.description );

SQL> SELECT * FROM domains;

ID  NAME        CODE    DESCRIPTION
--  --------   -----  ----------------
1   Domain A    D.A.  This is Domain A

SQL> DELETE domains;

SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
-- we're deleting and inserting the same row again

SQL> MERGE INTO domains a USING       
 (SELECT 2 id, 'Domain B' name, 'D.B.' code, 'This is Domain B' description 
    FROM domains) b
      ON ( a.name = b.name )
    WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description ) 
                          VALUES( b.id, b.name, b.code, b.description );


SQL> SELECT * FROM domains;

ID  NAME        CODE    DESCRIPTION
--  --------   -----  ----------------
1   Domain A    D.A.  This is Domain A
2   Domain B    D.B.  This is Domain B

Demo

Btw,后面跟着的部分USING关键字不必是 asubquery, but a table or a view。对当前案例进行评估:

MERGE INTO domains ds       --> "ds" : "domains" source
     USING v_domains dt     --> "dt" : "domains" target
        ON ( ds.name = dt.name )
      WHEN NOT MATCHED THEN INSERT( ds.id, ds.name, ds.code, ds.description ) 
                            VALUES( dt.id, dt.name, dt.code, dt.description )

创建后可以像上面的语句一样使用v_domains浏览

CREATE OR REPLACE VIEW v_domains AS
SELECT 2 id, 'Domain A' name, 'D.A.' code, 'This is Domain A' description 
  FROM domains
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MERGE 表,匹配时不执行任何操作 的相关文章

随机推荐

  • C# 中两个列表相交

    我有两个清单 List
  • 是如何实现的?

    C 没有 据我所知 重载或模板 对吧 那么 在普通的 C 语言中如何存在一组与类型无关的同名函数呢 通常的编译时技巧会涉及一大堆宏 不是吗 关于它在 GCC 中如何工作有一个很好的解释here 另外 如果有人能解决中等难度的练习 我很想知道
  • 更快的排列生成器

    我为 Scala 列表编写了一个排列生成器 它生成给定列表的所有排列 到目前为止 我已经得到以下基于这个 Haskell 实现 我认为它比我尝试过的其他几个选项更有效 有什么方法可以提高效率 或者我已经涵盖了所有基础吗 For each e
  • 通过Curl/PHP查询API

    我正在查看 Parse com REST API 并使用 PHP 使用的 Curl 包装器进行调用 原始 Curl 代码 有效 curl X GET H X Parse Application Id myApplicationID H X
  • Struts2 文件上传最大大小

    我需要上传最多 10 MB 的文件 我使用了以下内容 在我的 struts xml 中 我配置如下
  • 让 VB6 显示哪个组件没有安装设计时许可证

    我继承了一个我正在尝试 制作 的 VB6 项目 构建在 制作 EXE 步骤中失败 并出现许可错误 License information for this component not found You do not have an app
  • C# 代码在后台以静默模式运行我的 installer.exe 文件,[重复]

    这个问题在这里已经有答案了 我有这个 C 代码 string desktopPath Environment GetFolderPath Environment SpecialFolder Desktop ProcessStartInfo
  • mysql中的同步存储过程执行

    我有一个存储过程mysql也就是说 执行需要同步的任务 这样 如果两个应用程序调用存储过程 则只有一个应用程序可以访问一段代码来执行该任务 而另一个应用程序将被阻止 直到第一个应用程序完成任务 DELIMITER CREATE PROCED
  • Visual C++:#include 来自同一解决方案中其他项目的文件

    我正在使用 Visual C 开发游戏 我在单独的项目中有一些组件 并设置了项目依赖项 如何 include 来自不同项目的头文件 我不知道如何在另一个项目中使用一个项目中的类 编译器的设置 在您想要 include 头文件的项目中anot
  • 如何在 Scala 中使用正则表达式进行模式匹配?

    我希望能够找到单词的第一个字母与组中的一个字母 例如 ABC 之间的匹配项 在伪代码中 这可能看起来像 case Process word gt word firstLetter match case a c A C gt case gt
  • 在 R markdown 中使用内联带空格的变量名称

    我怎样才能包含内联R引用包含空格或其他异常字符的变量名的代码 实际用例是Pr gt F 反引号是解决方案简单地R脚本 但当代码内联在 Markdown 文档中时它们似乎不起作用 这是一个例子 r df lt data frame mydat
  • 如何针对特定查询优化表?

    您使用哪些模式来确定频繁查询 如何选择优化因素 人们可以做出哪些类型的改变 这是一个很好的问题 虽然相当广泛 但也并不更糟 如果我理解你的意思 那么你是在问如何从头开始解决优化问题 首先要问的问题是 是否存在性能问题 如果没有问题 那么就完
  • Lambda 表达式和高阶函数

    如何使用带有闭包的 Java 8 编写支持将函数作为参数并返回函数作为值的方法 在 Java Lambda API 中 主类是java util function Function 您可以像使用所有其他引用一样使用对此接口的引用 将其创建为
  • Powershell 4 Get-ScheduledTask 和 Windows

    我认为无论您使用什么操作系统 如果安装了 Powershell 您都可以访问相同的默认 cmdlet 所以我想用获取计划任务在我的 Windows 7 机器上 我安装了 Powershell 4 但是 当我运行它时 我收到错误 Get Sc
  • iOS:自动布局导致 UIScrollView 不滚动

    我已经设置了一个UIScrollView我想用它水平显示 12 张图像 屏幕上只能显示 8 张 在下图中 您可以看到我遇到的问题 这使得我的滚动视图无法滚动 我的约束和UIScrollView我已将其添加到故事板上 我已经调用了以下方法 v
  • Play 框架 CORS 标头

    我正在尝试为我的 Play 框架应用程序设置 CORS 标头 具体来说我收到这个错误 cannot load http 127 0 0 1 9000 No Access Control Allow Origin header is pres
  • ActiveRecord::StatementInvalid: PG::Error: 错误: 列“id”中的空值违反了非空约束

    我在我的应用程序中经常收到以下错误 如果我重新启动 Rails 应用程序 此错误将在一段时间内不会出现 导轨 3 1 3 红宝石 1 9 3 ActiveRecord StatementInvalid PG Error 错误 空值 列 id
  • Objective C 中的动态特性

    我发现 Objective C 对象属性可以标记为 dynamic让编译器知道实现将在运行时可用 我想知道是否有一种方法可以告诉编译器对象上的所有属性都是动态的 而无需逐一显式指定它们 我没有预先提供属性列表 我知道如果我只使用这不会成为问
  • Spring 的 @Autowired 是一个巨大的性能问题吗?

    我有一个项目 我不知道 200 300 daos 服务 控制器 我使用 Autowired将所有内容连接在一起 而不是指定中的所有内容applicationContext xml 我的问题是 这对我的启动时间有多大的性能影响 删除所有的是否
  • MERGE 表,匹配时不执行任何操作

    我有一张桌子DOMAINS在 2 个不同的列模式中ID NAME CODE DESCRIPTION For any NAME存在于新模式中 它应该使用现有的ID没有任何合并 对于那些新的NAME记录 它应该插入ID来自旧模式 MERGE I