一:merge into的形式
  MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
  WHEN MATCHED THEN
     [UPDATE sql]
  WHEN NOT MATCHED THEN
     [INSERT sql]

二:作用

  判断B表和A表是否满足on条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表,但有很多可选项。

  例如:
    1:正常模式
    2:只update或者只insert
    3:带条件的update或带条件的insert
    4:全插入insert实现
    5:带delete的update -------------------不做讲解

三:正常模式 

例如:

  1:创建表A_MERGE 

    create table A_MERGE
    (
    id NUMBER not null,
    name VARCHAR2(12) not null,
    year NUMBER
    );

  2:创建表B_MERGE
    create table B_MERGE
    (
    id NUMBER not null,
    aid NUMBER not null,
    name VARCHAR2(12) not null,
    year NUMBER,
    city VARCHAR2(12)
    );

  3:向A_MERGE和B_MERGE插入测试数据

    insert into A_MERGE values(1,'liuwei',20);

    insert into A_MERGE values(2,'zhangbin',21);

    insert into A_MERGE values(3,'fuguo',20);

    commit;

    insert into B_MERGE values(1,2,'zhangbin',30,'吉林');

    insert into B_MERGE values(2,4,'yihe',33,'黑龙江');

    insert into B_MERGE values(3,3,'fuguo','','山东');

     commit;

  4:MERGE INTO A_MERGE A
    USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
    ON (A.id=C.AID)
    WHEN MATCHED THEN
     UPDATE SET A.YEAR=C.YEAR
    WHEN NOT MATCHED THEN 
    INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
    commit;

  5:解析

    a:被更新的表写在MEGER INTO之后
    b:更新来源数据表写在USING之后,并将相关字段查询出来,为查询结果定义别名
    c:ON之后表示更新满足的条件
    d:WHEN MATCHED THEN:表示当满足条件时要执行的操作。
    e:UPDATE SET 被更新表.被更新字段 = 更新表.更新字段---此更新语句不同于常规更新语句
    f:WHEN NOT MATCHED THEN:表示当不满足条件时要执行的操作。
    g:INSERT (被更新表.被更新字段,...)  VALUES(更新表.更新字段,...)。
    h:commit:表示提交事务

四:只update或只insert 

  -------------------------------只更新--------------------------------------------------------
  merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
  ON(A.ID=C.AID)
  WHEN MATCHED THEN
  UPDATE SET A.YEAR=C.YEAR;
  commit;
                                                                                                     
  解析---只更新模式:
  1:将正常模式下的插入语句去除。
  2:使用WHEN MATCHED THEN,当满足条件的情况。
  -------------------------------只插入--------------------------------------------------------
  merge into A_MERGE A
  USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
  ON(A.ID=C.AID)
  WHEN NOT MATCHED THEN 
  insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
  commit;
  解析---只插入模式:
  1:将正常模式下的更新操作去除
  2:使用WHEN NOT MATCHED THEN,当不满足ON条件时执行插入操作。
五:带where条件的update和insert
    我们在on中进行条件匹配之后,还可以在后面的insert和update中对on删选出来的记录再做一次条件判断,用来控制
  那些需要更新,那些需要插入。
  merge into A_MERGE A
  USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C
  ON(A.id=C.AID)
  when matched then
  update SET A.name=C.name where C.city != '江西'
  when not matched then 
  insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city='江西';
  commit;
  解析:
  1:当满足on条件并且满足where条件才会执行更新操作。
  2:当不满足on条件但是满足where条件才会执行插入操作。
六:无条件的insert
    有时候我们需要将一张表的所有的数据插入到另一张表中,此时就可以添加常量过滤谓词来实现,让其只满足匹配和不匹配,
  这样就只有update或insert操作了。
  merge into C_MERGE C
  USING (select B.AID,B.NAME,B.City from B_MERGE B) C
  ON (1=0)
  when not matched then
   insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
  commit;
  解析:
  on条件处于永远不匹配的条件,此时就会执行全表插入操作。

源地址:https://www.cnblogs.com/zhaoja/p/11334544.html

oracle中的merge into用法解析的更多相关文章

  1. 在oracle中使用merge into实现更新和插入数据

    目录 oracle中使用merge into DUAL表解释 使用场景 用法 单表 多表 oracle中使用merge into DUAL表解释 在Oracle数据库中,dual是Oracle中的一个 ...

  2. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

  3. Oracle 中 CONTAINS 函数的用法

    Oracle 中 CONTAINS 函数的用法 1. 查询住址在北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( a ...

  4. oracle中next_day()、last_day()函数解析

    oracle中next_day()函数解析 Sql代码 当前系统时间的下一星期一的时间select   next_day(sysdate,1) from dual NEXT_DAY(date,char ...

  5. [转载]Oracle中TO_NUMBER()函数的用法

    1 用法简介TO_NUMBER函数()是Oracle中常用的类型转换函数之一,主要是将字符串转换为数值型的格式,与TO_CHAR()函数的作用正好相反. To_number函数的格式如下: To_nu ...

  6. Oracle中 to_date和to_char用法

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  7. Oracle中to_number()函数的用法

    to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...

  8. oracle 中 to_date 函数的用法

    常犯错的使用方法. to_date('2019-08-12 22:05:','yyyy-MM-dd HH24:mm:ss') Oracle中会引起错误:"ORA 01810 格式代码出现两次 ...

  9. oracle中merge into用法解析

    merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] an ...

  10. oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

随机推荐

  1. centos7的密码安全策略加固

    centos7操作系统 在CentOS 7上实现密码复杂度策略设置 一.使用login.defs文件 解析:/etc/login.defs 是设置新建用户帐号限制的文件.该文件里的配置对root用户无 ...

  2. Unity实现手机录音功能

    using UnityEngine;using System.Collections;public class MicPhoneScripts : MonoBehaviour{    private ...

  3. 在VSCODE的终端运行Python时汉字乱码问题处理

    问题描述 在VSCODE的终端运行Python时,打印输出中文时汉字出现乱码, 文件编码都是UTF-8 解决步骤 1.打开Settings配置窗口(Ctrl+,) 2.搜索:code-runner.e ...

  4. 我和Java这些年的故事(三)

    J2EE让Java在服务端找到了用武之地,之前一直处于鄙视链末端的Java,也终于有了向VB/VC叫板的资本.EJB更是J2EE的代名词,是解决企业级组件复用的法宝. 有了JSP/Servlet,Ja ...

  5. 增、改生产订单组件BAPI BAPI_ALM_ORDER_MAINTAIN

    转载留存 IT_METHODS    LIKE    BAPI_ALM_ORDER_METHOD处理方法,必选项,存储CREATE CREATETONOTIF CHANGE DELETE RELEAS ...

  6. 睿爸信奥-【临阵磨枪】练习赛(第一场)- T3

    目录 题面 题目背景 输入格式 输出格式 思路 code 题面 题目背景 徐老师很胖,长宽高比例为1:1:1,他每次走路都要滚来滚去~~现在假设在一个平面上有 n 个没有公共点公共点的圆.徐老师要从点 ...

  7. 01.BeanFactory实现

    /** beanFactory 不会做的事:* 1.不会主动调用BeanFactory 后处理器* 2.不会主动添加Bean后处理器* 3.不会主动初始化单例(懒加载)* 4.不会解析beanFact ...

  8. python 统计 excel 表格中文件总大小

    需求:统计excel 表格中文件总大小 表格内容,包含Mi.Gi.KB 96.73Mi 95.89Mi 6.89Gi 6.75Gi 10.00KB 统计总大小代码,目标是将Gi.KB换算成 Mi,然后 ...

  9. Python切换中英文输入法

    要实现中英文切换,首先Windows系统必须要有中文语言和英文语言,才能实现输入法(语言)切换. import win32api import win32gui from win32con impor ...

  10. js 三维数组转对象数组 二维数组转对象数组

    1. 三维数组转对象数组   输出: 代码如下: let dataArr = [ [ [109.654541015625, 29.34387539941801], [110.467529296875, ...