Oracle MERGE INTO语法探究

1、MERGE INTO 的用途:
   MERGE INTO 是Oracle 9i新增的语法,在10g时得到补充,用来合并UPDATE和INSERT语句,根据一张表或子查询与另一张表进行连接查询,连接条件匹配就进行

UPDATE,不匹配就进行INSERT,这个语法仅需要一次全表扫描就可以完成全部工作,执行效率会比单纯的UPDATE+INSERT高,具体应用可用于表之间的同步。
2、MERGE INTO 的语法:
语法结构:
MERGE [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;

语法说明:

MERGE INTO [表名] [别名]        --需要更新的目标表

USING ( 子查询/表名/视图)[别名] --源表

ON ([连接条件] AND [...]...)    --连接条件/更新条件

WHEN MATHED THEN UPDATE SET [...]  --如果匹配,更新表记录,若只作更新出来,下面的INSERT部分可以去掉

WHEN NOT MATHED THEN INSERT VALUES() [...]  --如果不匹配,插入表记录
3、MERGE INTO 演示:
  1> 创建测试表及数据:
     --以表YAG1作为源表,表YAG2作为更新的目标表
     CREATE TABLE YAG1 AS SELECT OBJECT_NAME,oOBJECT_ID FROM USER_OBJECTS WHERE ROWNUM<=10;
     CREATE TABLE YAG2 AS SELECT OBJECT_NAME,oOBJECT_ID FROM USER_OBJECTS WHERE ROWNUM<=5;
     --修改表YAG1中某条记录的OBJECT_NAME,创造符合UPDATE的条件,
     SQL> UPDATE YAG1 SET OBJECT_NAME=‘AAAAA‘ WHERE OBJECT_NAME=‘T_CAT‘;
  2>MERGE INTO 更新前两表的记录对比:
     SQL> SELECT A.OBJECT_ID,A.OBJECT_NAME,B.OBJECT_NAME FROM YAG1 A,YAG2 B WHERE A.OBJECT_ID=B.OBJECT_ID(+) ORDER BY 1;
A.OBJECT_ID      A.OBJECT_NAME        B.OBJECT_NAME
------------   ----------------   -----------------
46366            AAAAA              T_CAT
46367            SUM_STRING         SUM_STRING
46368            ARRAYLIST         ARRAYLIST
46369            TYSKZ_SJDX         TYSKZ_SJDX
46370            TYSKZ_SJXMGX         TYSKZ_SJXMGX

46371            PARAOBJECT 
46372            T_LINK 
46373            STR_SPLIT 
46374            SPLIT_TYPE 
46375            SYS_PLSQL_95487_9_1 
  3> 执行下面MERGE INTO 语句:
MERGE INTO YAG2 A
USING YAG1 B
ON (A.OBJECT_ID = B.OBJECT_ID)
WHEN MATCHED THEN
  UPDATE SET A.OBJECT_NAME = B.OBJECT_NAME
WHEN NOT MATCHED THEN
  INSERT VALUES (B.OBJECT_NAME, B.OBJECT_ID);
COMMIT; 
  4> MERGE INTO 更新后两表的记录对比:
     SQL> SELECT A.OBJECT_ID,A.OBJECT_NAME,B.OBJECT_NAME FROM YAG1 A,YAG2 B WHERE A.OBJECT_ID=B.OBJECT_ID(+) ORDER BY 1;
A.OBJECT_ID      A.OBJECT_NAME        B.OBJECT_NAME
------------   ----------------   -----------------
46366            AAAAA              AAAAA
46367            SUM_STRING         SUM_STRING
46368            ARRAYLIST           ARRAYLIST
46369            TYSKZ_SJDX         TYSKZ_SJDX
46370            TYSKZ_SJXMGX         TYSKZ_SJXMGX
46371            PARAOBJECT         PARAOBJECT
46372            T_LINK               T_LINK
46373            STR_SPLIT         STR_SPLIT
46374            SPLIT_TYPE         SPLIT_TYPE
46375            SYS_PLSQL_95487_9_1 SYS_PLSQL_95487_9_1
.

Oracle MERGE INTO语法探究

时间: 2024-10-13 06:01:57

Oracle MERGE INTO语法探究的相关文章

oracle merge into 语法

MERGE INTO upperLowerLimitData t1 USING (select name,enname,starttime,value ...   from dual) t2 ON (t1.name = t2.name and t1.enname = t2.enname) WHEN MATCHED THEN UPDATE SET t1.starttime = t2.starttime, t1.value = t2.value WHEN NOT MATCHED THEN INSER

Oracle Merge into [转] [ http://www.cnblogs.com/dongsheng/p/4384754.html]

Oracle中Merge into用法总结 起因: 前段时间,因为涉及到一张表的大数据操作,要同时进行增删改,我跟师傅想了很多优化办法,结果都不尽人意.刚开始用的就是原始算法,先更新现有记录,再插入满足要求的其他记录,最后再删除多余记录,但是少量数据还可以,10W条数据就不行了,前台的超时时间是60s,远远无法满足要求.之后又想办法将任务进行拆分,根据每条记录流水号尾字符不同进行拆分,用多个线程同时执行,一直拆分成10个任务(尾字符分别为0.1.2.3 ... 9),用十个线程同时去执行,但是时

Oracle MERGE INTO的用法

很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 提供有条件地更新和插入数据到数据库表中 如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 - 避免了分开更新 - 提高性能并易于使用

[Oracle] Merge语句

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; MERGE是什么,如何使用呢?让我们先看一个简单的需求: 需求是,从T1表更新数

oracle merge用法

动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert). 实战: 接下来我们有一个任务,有一个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录.在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL S

Oracle MERGE INTO的使用方法

非常多时候我们会出现例如以下情境,假设一条数据在表中已经存在,对其做update,假设不存在,将新的数据插入.假设不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这种话须要写很多其它的代码,同一时候性能也不好,要来回数据库两次.使用merge的话则能够一条SQL语句完毕. 1)主要功能 提供有条件地更新和插入数据到数据库表中 假设该行存在,运行一个UPDATE操作,假设是一个新行,运行INSERT操作 - 避免了分开更新 - 提高性能

[转载]Oracle Merge的使用

FROM: http://zhangqchang.blog.163.com/blog/static/464989732009219114653226/ 摘至网上的几个例子 一.*****************************************************************Merger into是oracle从9i开始增加的一个语句,从merge的字面上的意思:合并, 兼并不难理解merge在oracle中的含义,merge在oracle所起的作用是:如果你从 以

ORACLE MERGE INTO

使用一条SQL语句进行insert或者Update操作,如果数据库中存在数据就update,如果不存在就insert. Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert. 当using后面的SQL没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的. 1 测试数据准备 select * from student order by stu_id; select * from student_tem

Oracle merge into的优势

简介 Oracle merge into命令,顾名思义就是“有则更新,无则插入”,这个也是merge into 命令的核心思想,在实际开发过程中,我们会经常遇到这种通过两表互相关联匹配更新其中一个表的某些字段的业务,有时还要处理不匹配的情况下的业务.这个时候你会发现随着表的数据量增加,类似这种业务场景的执行效率会比较慢,那是因为你需要多次重复查询两表中的数据,而通过merge into命令,只需要一次关联即可完成“有则更新,无则插入”的业务场景,大大提高语句的执行效率. 语法 1 merge i