• 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);
      本人今天看到了,觉得不错,呵呵,如有存在问题,希望能给以指导!
  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/6722028.html
Copyright © 2020-2023  润新知