• ORACLE:MERGE INTO


       

    MERGE INTO用法

    2012-08-16  8210493  摘自 天涯社区  阅 49380  转 135
    动机:
       想在Oracle中用一条SQL语句直接进行Insert/Update的操作。
      说明:
       在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)。
      merge into 是特有的功能,相当于在 MSSQL中的
      if exists(...)
       update table
      else
       Insert into table.
      merge into 语法不仅没有if exists语法啰嗦,而且比if exists 还要高效很多。我经常用来在oracle之间同步数据库表。
      语法如下:
      MERGE INTO table_name alias1
      USING (table|view|sub_query) alias2
      ON (join condition)
      WHEN MATCHED THEN
      UPDATE table_name
      SET col1 = col_val1,
      col2 = col2_val
      WHEN NOT MATCHED THEN
      INSERT (column_list) VALUES (column_values);
      
      如果不懂Merge语句的原理,Merge语句是一条比较危险的语句,特别是在您只想更新一条记录的时候,因为不经意间,你可能就把整表的数据都Update了一遍.....汗!!!
      ORACLE 9I中加入了MERGE
        语法:
        MERGE [hint] INTO [schema .] table [t_alias]
        USING [schema .] { table | view | subquery } [t_alias]
        ON ( condition )
        WHEN MATCHED THEN merge_update_clause
        WHEN NOT MATCHED THEN merge_insert_clause;
        创建测试数据表:
        create table tj_test(id number,name varchar2(20),age number);
        向表中插入数据:
        insert into tj_test values (1,'jan',23);
        insert into tj_test values (2,'kk',22);
        insert into tj_test values (3,'joe',27);
        select * from tj_test;
        查询结果如下:
        1 jan 23
        2 kk 22
        3 joe 27
        创建另一新表
        create table tj_test1 as select * from tj_test where 1=0
        插入一条数据
        insert into tj_test1 values (1,'jlk',23);
        select * from tj_test1
        查询结果如下:
        1 jkl 23 --注意,这里的的NAME字段中的值是jkl
        使用MERGE,实现有则更新,无则插入,sql语句如下:
        merge into tj_test1 tt1
        using tj_test tt
        on (tt1.id=tt.id)
        when matched then
        update set
        tt1.name=tt.name,
        tt1.age=tt.age
        when not matched then
        insert values(
        tt.id,
        tt.name,
        tt.age)
        查询tj_test1表(对比原来表中的数据,更新了ID=1 ROW中字段NAME,同时多出两条新数据)
        select * from tj_test1
        改变行数据如下:
        1 jan 23 --这里的原有jkl值被更新
        3 joe 27 --原来表中没有的插入
        2 kk 22 --原来表中没有的插入
        如果存在就更新,不存在就插入
        9i已经支持了,是Merge,但是只支持select子查询,
        如果是单条数据记录,可以写作select …… from dual的子查询。
        语法为:
        MERGE INTO table
        USING data_source
        ON (condition)
        WHEN MATCHED THEN update_clause
        WHEN NOT MATCHED THEN insert_clause;
        如:
        MERGE INTO course c
        USING (SELECT course_name, period,
        course_hours
        FROM course_updates) cu
        ON (c.course_name = cu.course_name
        AND c.period = cu.period)
        WHEN MATCHED THEN
        UPDATE
        SET c.course_hours = cu.course_hours
        WHEN NOT MATCHED THEN
        INSERT (c.course_name, c.period,
        c.course_hours)
        VALUES (cu.course_name, cu.period,
        cu.course_hours);
      本人今天看到了,觉得不错,呵呵,如有存在问题,希望能给以指导!
  • 相关阅读:
    C/C++内存管理 笔记
    RAII惯用法:C++资源管理的利器
    JS、Flash 实现复制功能 (浏览器兼容)
    JS页面刷新实现方法总结
    php 一些常用的语句
    使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
    window.opener.location.reload() and href()的区别 弹出页修改后刷新父窗体
    查看Mysql数据库大小
    JQUERY操作集锦
    十进制正整数转换成六十二进制
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/6722028.html
Copyright © 2020-2023  润新知