Oracle更新的两种方式(merge/update内联视图)

标签: oracle 更新 merge | 发表时间:2016-01-21 20:41 | 作者:tooby
出处:http://www.iteye.com

对于Oracle的两表联合更新的场景(有A、B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:

创建用例表:

CREATE TABLE test1(ID NUMBER(10),NAME VARCHAR2(20));

INSERT INTO test1 VALUES(1,'lucy');

INSERT INTO test1 VALUES(2,'lily');

 

CREATE TABLE test2(ID NUMBER(10),NAME VARCHAR2(20));

INSERT INTO test2 VALUES(1,'lucy');

INSERT INTO test2 VALUES(2,'hanmeimei');

 

merge方式:

MERGE INTO test1 USING test2

ON (test1.id = test2.id)

WHEN MATCHED THEN UPDATE

  SET test1.name = NVL2(test1.name,test2.name,test1.name);

 

merge方法是最简洁,效率最高的方式,在大数据量更新时优先使用这种方式。

 

update内联视图方式:

使用这种方式必须在test2.id上有主键(这里很好理解,必须保证每一个test1.id对应在test2里只有一条记录,如果test2中有多条对应的记录,怎么更新test1?),一般而言这种方式代价比merge方式稍高。

ALTER TABLE test2 ADD CONSTRAINT pk_test2 PRIMARY KEY(ID);

UPDATE (SELECT a.id aid,a.name aname,b.id bid,b.name bname FROM TEST1 a,test2 b WHERE a.id=b.id) t

SET aname = NVL2(aname,bname,aname);

 

使用并行,加快大量数据更新:

MERGE /*+parallel(test1,4)*/ INTO test1 USING test2

ON (test1.id = test2.id)

WHEN MATCHED THEN UPDATE

  SET test1.name = NVL2(test1.name,test2.name,test1.name);



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [oracle 更新 merge] 推荐:

Oracle更新的两种方式(merge/update内联视图)

- - 数据库 - ITeye博客
对于Oracle的两表联合更新的场景(有A、B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:. merge方法是最简洁,效率最高的方式,在大数据量更新时优先使用这种方式. update内联视图方式:. 使用这种方式必须在test2.id上有主键(这里很好理解,必须保证每一个test1.id对应在test2里只有一条记录,如果test2中有多条对应的记录,怎么更新test1.

Oracle中Merge Into 代替Insert/Update的应用

- - 数据库 - ITeye博客
在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert). 在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中的记录数.

Oracle的Filter,Nest loop,Merge sort join和Hash join(原创)

- - ITeye博客
按照Merge Sort Join连接的两表地位完全相同. 这种算法会把每个表按照连接列进行排序,生成两个排序集. 然后对两个排序集进行一次遍历便可以得到最终结果集. 这个算法的特点是,每个表都需要排序,排序后都需要遍历一次. 以下面的例子说明,Merge Sort Join的执行过程如下:. 1、根据tabs表的where条件,查找出符合条件的结果集.

oracle表之间的连接之------>排序合并连接(Merge Sort Join)

- - CSDN博客数据库推荐文章
排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景如下:. a,通常情况下,排序合并连接的执行效率远不如哈希连接,但前者的使用范围更广,因为哈希连接只能用于等值连接条件,而排序合并连接还能用于其他连接条件(如<,<=,>.>=).

mysql-merge合并表

- - CSDN博客编程语言推荐文章
注意: 1 每个子表的结构必须一致,主表和子表的结构需要一致, 2 每个子表的索引在merge表中都会存在,所以在merge表中不能根据该索引进行唯一性检索. 3 子表需要是MyISAM引擎 4 AUTO_INCREMENT 不会按照你所期望的方式工作. 建表语句 create table tablename(正常的字段)engine=merge insert_method=last insert_method: 有两个值如下: LAST 如果你执行insert 指令来操作merge表时,插入操作会把数据添加到最后一个子表中.

【转】Mysql MERGE引擎简介

- - 编程语言 - ITeye博客
一. 什么是MERGE 引擎. MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询. 如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE表这时会非常简单有效. 执行select * from t;将会得到如下结果.

[转]MapReduce:详解Shuffle(copy,sort,merge)过程

- - 芒果先生Mango的专栏
Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方. 要想理解MapReduce, Shuffle是必须要了解的. 我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混. 前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟.

【转】恢复ORACLE被误更新或删除数据的办法

- - Oracle - 数据库 - ITeye博客
有时候我们在操作ORACLE数据库的时候,可能由于SQL写错了导致把数据update错了,或者delete删除掉了,那么这时候如何去恢复之前的数据呢. 莫着急,我们可以采用oracle的基于时间查询as of timestamp的办法进行恢复数据. 1、比如,我的wl_notify_task表目前有三条数据,大家重点关注PARAMETER字段.

ORACLE----TimeStamp(时间戳)字段自动更新

- -
之前对id的自增长进行了设置,原以为时间戳的更新也类似,使用序列之类的,但最终发现跟序列没半毛钱关系. 触发器是肯定要用的,但编写脚本也是需要的. 图2中,我们要选择事件(即例子中的INSERT,UPDATE),触发时间(即INSERT,UPDATE事件的前或后,例子中是before),列(例子中为MODIFIED_DATE,为TimeStamp类型),新旧值(为系统默认值OLD和NEW).

Oracle Java SE 8 发行版更新:限制商业或生产用途

- - 开源中国社区最新新闻
Oracle Java SE 8 发行版更新. Oracle Java SE 8 的公开更新仍面向单独的个人使用提供,至少持续至 2020 年底. 2019 年 1 月以后发布的 Oracle Java SE 8 公开更新将不向没有商用许可证的业务、商用或生产用途提供. 如果您是使用者,将 Java 用于单独的个人用途,则至少在 2020 年底之前,您对 Oracle Java SE 8 更新仍具有与现在相同的访问权限.