zoukankan      html  css  js  c++  java
  • oracle中merge into用法解析

    merge into的形式:

    1. MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
    2.  
      WHEN MATCHED THEN
    3.  
      [UPDATE sql]
    4.  
      WHEN NOT MATCHED THEN
    5.  
      [INSERT sql]

    作用:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表但是有很多可选项,如下:
    1.正常模式

    2.只update或者只insert

    3.带条件的update或带条件的insert

    4.全插入insert实现

    5.带delete的update(觉得可以用3来实现)
    下面一一测试。

    测试建以下表:

      


    create table A_MERGE
    (
    id NUMBER not null,
    name VARCHAR2(12) not null,
    year NUMBER
    );
    create table B_MERGE
    (
    id NUMBER not null,
    aid NUMBER not null,
    name VARCHAR2(12) not null,
    year NUMBER,
    city VARCHAR2(12)
    );
    create table C_MERGE
    (
    id NUMBER not null,
    name VARCHAR2(12) not null,
    city VARCHAR2(12) not null
    );
    commit;

    其表结构截图如下图所示:

    A_MERGE表结构:

    B_MERGE表结构

    C_MERGE表结构

    1.正常模式

    先向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;

    此时A_MERGE和B_MERGE表中数据截图如下:

    A_MERGE表数据:

    B_MERGE表数据:

    然后再使用merge into用B_MERGE来更新A_MERGE中的数据:

    select A.ID, A.NAME,A.YEAR,B.ID,B.AID,B.NAME,B.CITY,B.YEAR from A_MERGE A,B_MERGE B WHERE A.ID= B.AID

     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;

    此时A_MERGE中的表数据截图如下:



    2.只update模式
    首先向B_MERGE中插入两个数据,来为了体现出只update没有insert,必须有一个数据是A中已经存在的

    另一个数据时A中不存在的,插入数据语句如下:

    1.  
      insert into B_MERGE values(4,1,'liuwei',80,'江西');
    2.  
      insert into B_MERGE values(5,5,'tiantian',23,'河南');
    3.  
      commit;

    此时A_MERGE和B_MERGE表数据截图如下:
    A_MERGE表数据截图:

    B_MERGE表数据截图:

    然后再次用B_MERGE来更新A_MERGE,但是仅仅update,没有写insert部分。

    1.  
      merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)
    2.  
      WHEN MATCHED THEN
    3.  
      UPDATE SET A.YEAR=C.YEAR;
    4.  
       
    5.  
      commit;

    merge完之后A_MERGE表数据截图如下:可以发现仅仅更新了AID=1的年龄,没有插入AID=4的数据


    3.只insert模式
    首先改变B_MERGE中的一个数据,因为上次测试update时新增的数据没有插入到A_MERGE,这次可以用。

    1.  
      update B_MERGE set year=70 where AID=2;
    2.  
      commit;

    此时A_MERGE和B_MERGE的表数据截图如下:
    A_MERGE表数据:

    B_MERGE表数据:

    然后用B_MERGE来更新A_MERGE中的数据,此时只写了insert,没有写update:

    1.  
      merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)
    2.  
      WHEN NOT MATCHED THEN
    3.  
      insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
    4.  
      commit;

    此时A_MERGE的表数据截图如下:

    4.带where条件的insert和update。
    我们在on中进行完条件匹配之后,还可以在后面的insert和update中对on筛选出来的记录再做一次条件判断,用来控制哪些要更新,哪些要插入。
    测试数据的sql代码如下,我们在B_MERGE修改了两个人名,并且增加了两个人员信息,但是他们来自的省份不同,
    所以我们可以通过添加省份条件来控制哪些能修改,哪些能插入:

    1.  
      update B_MERGE set name='yihe++' where id=2;
    2.  
      update B_MERGE set name='liuwei++' where id=4;
    3.  
      insert into B_MERGE values(6,6,'ningqin',23,'江西');
    4.  
      insert into B_MERGE values(7,7,'bing',24,'吉安');
    5.  
      commit;

    A_MGERGE表数据截图如下:

    B_MERGE表数据:

    然后再用B_MERGE去更新A_MERGE,但是分别在insert和update后面添加了条件限制,控制数据的更新和插入:

    1.  
      merge into A_MERGE A USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C
    2.  
      ON(A.id=C.AID)
    3.  
      when matched then
    4.  
      update SET A.name=C.name where C.city != '江西'
    5.  
      when not matched then
    6.  
      insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city='江西';
    7.  
      commit;



    此时A_MERGE截图如下:

    5.无条件的insert。
    有时我们需要将一张表中所有的数据插入到另外一张表,此时就可以添加常量过滤谓词来实现,让其只满足
    匹配和不匹配,这样就只有update或者只有insert。这里我们要无条件全插入,则只需将on中条件设置为永假
    即可。用B_MERGE来更新C_MERGE代码如下:

    1.  
      merge into C_MERGE C USING (select B.AID,B.NAME,B.City from B_MERGE B) C ON (1=0)
    2.  
      when not matched then
    3.  
      insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
    4.  
      commit;

    C_MERGE表在merge之前的数据截图如下:

    B_MERGE数据截图如下:

    C_MERGE表在merge之后数据截图如下:


    6.带delete的update
       MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. 
    DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.
    但我觉得这个带where条件的update差不多,都是控制update,完全可以用带where条件的update来实现。

    来源:https://blog.csdn.net/jeryjeryjery/article/details/70047022

  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/kongxc/p/9237941.html
Copyright © 2011-2022 走看看