加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 16:08:59 所属栏目:百科 来源:网络整理
导读:对于 Oracle 的两表联合更新的场景(有 A 、 B 两表,以 A.id=B.id 关联,根据 B 表中的记录更新 A 表中的相应字段),一般有 update 内联视图和 merge 两种方式,下面举例介绍: 创建用例表: CREATE TABLE test1(ID NUMBER(10),NAME VARCHAR2(20)); INSERT

对于Oracle的两表联合更新的场景(有AB两表,以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),102); line-height:26px; font-family:SimSun; font-size:10.5pt"> INSERT INTO test2 VALUES(1,102); line-height:26px; font-family:SimSun; font-size:10.5pt"> 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,test1.name);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读