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用法(df1的的列索引和df2的行索引对应时候的)

  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. Javac早期(编译期)

    从Sun Javac的代码来看,编译过程大致可以分为3个过程: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. Javac编译动作的入口是com.sun.tools. ...

  2. BZOJ1580 : [Usaco2009 Hol]Cattle Bruisers 杀手游戏

    以贝茜为参照物,则贝茜固定于原点,每个杀手是一个圆心在某条射线上的圆. 解出每个杀手可以射杀贝茜的时间区间,然后扫描线即可,时间复杂度$O(n\log n)$. #include<cstdio& ...

  3. SVN标准命令

    SVN标准命令 范例 checkout 检出 svn  co  URL 检出app/search/news/apache/主干上最新版本到本地工作副本,可执行命令: svn co  https://s ...

  4. JAVA计算文件大小

    File f = new File(save_path+File.separator + resouce_id+".zip"); FileInputStream fis = new ...

  5. 【BZOJ】1452: [JSOI2009]Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1452 题意:n×m的矩阵上每个点有个颜色,现在有q个操作:1 x y c 将点(x,y)的颜色改为c ...

  6. 基于Berkeley DB实现的持久化队列

    转自:http://guoyunsky.iteye.com/blog/1169912 队列很常见,但大部分的队列是将数据放入到内存.如果数据过多,就有内存溢出危险,而且长久占据着内存,也会影响性能.比 ...

  7. hdu 1735 字数统计

    这道题是到贪心的题目,首先用ans记录下所有的0的个数,然后尽量去掉更多的0,剩下的0的个数就是最少的字数.首先想到最后一行的0的个数可以减掉,然后就是m行开头的两个0可以减掉.然后思考最多还可以减掉 ...

  8. thinkphp的html模板中if的使用

    写的时候正好出错,我就纠结是{if}还是手册中的<if condition>,当然我使用的是手册中的用法,但是点击按钮时候还是没展开(if后的条件没执行).如图 试了好多写法,也检查了多次 ...

  9. c#委托事件及其讲解

    一定要标明出处,波哥的文章.所有文章都值得一看.这篇是摘抄的大白话之C#事件讲解.委托 http://www.cnblogs.com/wudiwushen/archive/2010/04/20/170 ...

  10. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...