Merge用法

时间:2023-02-03 17:01:20
Merge用来从一个表中选择一些数据更新或者插入到另一个表中。而最终是用更新还是用插入的方式取决于该语句中的条件。
下面我们简单的举一个例子:
 
SQL> create table merge_test1(a number,b varchar2(20))
表已创建。
SQL> create table merge_test2(a number,b varchar2(20))
表已创建。
SQL> insert into merge_test1 values(1,'A');
已创建 1 行。
SQL> insert into merge_test1 values(2,'B');
已创建 1 行。
SQL> insert into merge_test1 values(3,'C');
已创建 1 行。
SQL> insert into merge_test2 values(3,'C');
已创建 1 行。
SQL> insert into merge_test2 values(2,'C');
已创建 1 行。
SQL> commit;
提交完成。
 
SQL> select * from merge_test1;
         A B
---------- --------------------
         1 A
         2 B
         3 C
SQL> select * from merge_test2;
         A B
---------- --------------------
         3 C
         2 C
前面的准备工作之后,用Merge对 Merge_test2进行更新
 
MERGE INTO MERGE_TEST2 M
USING MERGE_TEST1 N
ON (M.A = N.A)
WHEN MATCHED THEN
 UPDATE SET M.B = N.B
WHEN NOT MATCHED THEN
 INSERT (M.A,M.B) VALUES (N.A,N.B);
 
更新后结果:
SQL> select * from merge_test2;
         A B
---------- --------------------
         1 A
         3 C
         2 B
 
总结:
一、Merge 的用法大致上有三种:
1、只更新不插入
Merge into Merge_test2 M
Using Merge_test1 N
ON (M.A = N.A)
WHEN MATCHED THEN
UPDATE SET M.B = N.B;
2、只插入不更新
MERGE INTO merge_test2 M
USING merge_test1 N
ON (M.A =N.A) 
WHEN NOT MATCHED THEN
INSERT (M.A,M.B) VALUES(N.A,N.B);
3、既插入也更新
MERGE INTO merge_test2 M
USING merge_test1 N
ON(M.A = N.A)
WHEN  MATCHED THEN
UPDATE SET M.B=N.B
WHEN NOT MATCHED THEN
INSERT (M.A,M.B) VALUES(N.A,N.B)
 
二、注意事项
1、merge语句中,update不能用于更新连接的列(即ON(M.A = N.A))
例如:
MERGE INTO merge_test2 M
USING merge_test1 N
ON(M.A = N.A)
WHEN  MATCHED THEN
UPDATE SET M.A=N.B ,M.B=N.B
WHEN NOT MATCHED THEN
INSERT (M.A,M.B) VALUES(N.A,N.B)
 
我们执行上面的语句(注意红色部分)就会有如下的提示:
第 3 行出现错误:
ORA-38104: 无法更新 ON 子句中引用的列: "M"."A"
 
2、Using 后面不一定是表:
  语法文档上写着:table,view,subquery
  也就是说也可以是一个查询语句的结果集。
 
3、还有一种错误就是由于关联的值不唯一引起的
比如:
在merge_test1中再插入一条数据。与之前的重复了!
SQL> insert into merge_test1 values(3,'d');
 
此时我们执行
MERGE INTO merge_test2 M
USING merge_test1 N
ON(M.A = N.A)
WHEN  MATCHED THEN
UPDATE SET M.B=N.B
WHEN NOT MATCHED THEN
INSERT (M.A,M.B) VALUES(N.A,N.B)
。。。。。。。。。。。。。。。。。。
        
 

Merge用法的更多相关文章

  1. Oracle之Merge用法

    Merge用来从一个表中选择一些数据更新或者插入到另一个表中.而最终是用更新还是用插入的方式取决于该语句中的条件. 下面我们简单的举一个例子: SQL)) 表已创建. SQL)) 表已创建. SQL, ...

  2. TSQL Merge 用法

    在更新数据仓库时,经常需要根据源表对Target表进行数据同步,Merge 命令具有数据更新,删除,插入的功能,专门用于数据同步,并将数据的更新输出到表中.在使用Merge命令时,需要注意when n ...

  3. MERGE 用法

    1.不带输出的SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[InsertShiGongJiao] ), @com ...

  4. oracle merge用法

    动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...

  5. Sql server2008中merge用法

    /// <summary> /// 修改:添加条件: AND roleModule.FuncCode = tvpRoleModule.FuncCode /// </summary&g ...

  6. SQL Server merge用法

    有两个表名:source 表和 target 表,并且要根据 source 表中匹配的值更新 target 表. 有三种情况: source 表有一些 target 表不存在的行.在这种情况下,需要将 ...

  7. sqlserver——merge用法

    merge集插入,更新,删除于一体,如果要对一个表同时进行插入,更新,删除2个或3三个操作.效率要高于单个操作. merge into tableb b --被操作表using (select id, ...

  8. pandas关于其他merge用法&lpar;df1的的列索引和df2的行索引对应时候的&rpar;

  9. git rebase和git merge的用法

    http://softlab.sdut.edu.cn/blog/subaochen/2016/01/git-rebase%E5%92%8Cgit-merge%E7%9A%84%E7%94%A8%E6% ...

随机推荐

  1. 【转载】windows平台安装nodejs过程

    第一步 下载nodejs 访问https://nodejs.org/en/download/url 根据您的系统是32位或64位,按照文字说明进行下载 第二步 安装nodejs 双击运行nodejs的 ...

  2. JavaScript Patterns 4&period;2 Callback Pattern

    function writeCode(callback) { // do something... callback(); // ... } function introduceBugs() { // ...

  3. 六间房 繁星 酷我 来疯 秀吧 新浪秀 直播播放器 Live 1&period;2

    适合用于进行录制的时候 特别说明: 安装 falsh play 19 时 不能正常播放 每个按钮都有提示,不详细说明 下载地址 http://pan.baidu.com/s/1i32ETIt 下载地址 ...

  4. static与C&num;中的static

    Static 1.静态方法与非静态方法 a.静态方法的调用类.静态方法名([参数列表]) 非静态方法的调用类 对象 = new 类的构造函数([参数列表])对象.非静态方法名([参数列表]) 静态方法 ...

  5. &lbrack;Angular 2&rsqb; How To Debug An Angular 2 Application - Debugging via Augury or the Console

    In this lesson we will learn several ways to debug an Angular 2 application, including by using Augu ...

  6. IOS--跳转方式两种

    带导航栏的Push跳转: FloatPassViewController *floatpass = [self.storyboard instantiateViewControllerWithIden ...

  7. CodeForces 709C Letters Cyclic Shift

    贪心. 肯定是两个$a$之间的那些字符都$-1$,没有$a$就全部$-1$.如果输入的串全是$a$,那么把最后一个$a$改成$z$. #pragma comment(linker, "/ST ...

  8. 关于echarts使用的各种问题

    此文为作者辛苦编写,如有转发,请注明出处,谢谢 首先引入js文件,这是动态引入 <script src="http://echarts.baidu.com/build/dist/ech ...

  9. perl命令&plus;关键字

    来源: http://www.cnblogs.com/itech/archive/2012/11/01/2749666.html http://www.garybeene.com/vb/tut-per ...

  10. nodejs 实践:express 最佳实践 &lpar;一&rpar;

    express 最佳实践 (一) 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色,, 在 web同构 方面, nodejs 的优势 ...