对于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),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);
原文地址:https://www.jb51.cc/oracle/213158.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。