相关更新与merge into这两个的更新方式非常方式非常相似,但是有所区别。以下是两个更新方式的测试过程:
----相关更新的测试:
--创建两个测试表t4、t5:
SQL> create table t4(
2 id number(2),
4 name varchar2(6),
5 created date);
Table created.
SQL> create table t5(
2 id number(2),
4 name varchar2(6),
5 created date);
Table created.
--往两个表中插入数据:
insert into t4 values(12,'eemm',sysdate);
insert into t4 values(13,'',sysdate);
insert into t4 values(14,'',sysdate);
insert into t4 values(15,'ookk',sysdate);
insert into t5 values(12,'','');
insert into t5 values(13,'hhss',sysdate);
insert into t5 values(14,'hhll',sysdate);
insert into t5 values(15,'','');
--查看个表的数据:
SQL> select * from t4;
ID NAME CREATED
--- ------ -------------------
12 eemm 2016-10-21 18:04:18
13 2016-10-21 18:04:18
14 2016-10-21 18:04:18
15 ookk 2016-10-21 18:04:20
SQL> select * from t5;
ID NAME CREATED
--- ------ -------------------
12
13 hhss 2016-10-21 17:50:00
14 hhll 2016-10-21 17:50:00
15
--直接更新:
SQL> update t4 set name =(select name from t5 where t4.id=t5.id);
4 rows updated.
SQL> select * from t4;
ID NAME CREATED
--- ------ -------------------
12 2016-10-21 18:04:18
13 hhss 2016-10-21 18:04:18
14 hhll 2016-10-21 18:04:18
15 2016-10-21 18:04:20
这个更新明显是错误的。对于该例子,其实预计指向跟新2条数据的,但最后更新了4条,这表明给更新出问题了,
从查询的数据来看,更新后的name字段应该都有数据的。
有时候,感觉很爽快,以为是更新对了,直接commit提交了,但是最好要检查后的效果是不是预想的效果,
或者预计更新数据的条数,跟预期更新数据条数相差大的,可能就是更新错误的,这时候就要回滚到更新前的数据。
--正确的更新语句:
SQL> update t4 set name =(select name from t5 where t4.id=t5.id) where t4.name is null;
2 rows updated.
SQL> select * from t4;
ID NAME CREATED
--- ------ -------------------
12 eemm 2016-10-21 18:04:18
13 hhss 2016-10-21 18:04:18
14 hhll 2016-10-21 18:04:18
15 ookk 2016-10-21 18:04:20
所以这里提醒:生成环境中要进行大量数据的相关更新的时候,最好要先进行测试执行的语句是否为
正确的语句,更新后还要看看更新数据的效果,最后确定了,再提交任务,避免惹来麻烦。
----merge into更新方法:
--原表t5原来的数据:
SQL> select * from t5;
ID NAME CREATED
--- ------ -------------------
12
13 hhss 2016-10-21 17:50:00
14 hhll 2016-10-21 17:50:00
15
--测试表t6:
create table t6(
id number(2),
name varchar2(6),
created date);
--往表t6中插入数据:
insert into t6 values(12,'eemm',sysdate);
insert into t6 values(13,'hhss',sysdate);
insert into t6 values(14,'hhll',sysdate);
insert into t6 values(15,'ookk',sysdate);
insert into t6 values(16,'kkkk',sysdate);
SQL> select * from t6;
ID NAME CREATED
--- ------ -------------------
12 eemm 2016-10-23 15:17:06
13 hhss 2016-10-23 15:17:06
14 hhll 2016-10-23 15:17:06
15 ookk 2016-10-23 15:17:06
16 kkkk 2016-10-23 15:17:09
--更新1(只更新name字段:数据多的表t6往数据少的表t5跟新或插入):
SQL> merge into t5 t
2 using t6 d on (t.id=d.id)
3 when matched then
4 update set t.name = d.name
5 when not matched then
6 insert (t.id,t.name) values(d.id,d.name);
5 rows merged.
SQL> select * from t5;
ID NAME CREATED
--- ------ -------------------
12 eemm
13 hhss 2016-10-21 17:50:00
14 hhll 2016-10-21 17:50:00
15 ookk
16 kkkk
SQL> commit;
Commit complete.
新 表t5的数据也作为更新2的基表数据。
--创建测试表t7并查询:
create table t7(
id number(2),
name varchar2(6),
tel varchar2(11),
created date);
--插入数据:
insert into t7 values(12,'eemm','13645678921',sysdate);
insert into t7 values(13,'','13645678921',sysdate);
insert into t7 values(14,'','13645678921',sysdate);
insert into t7 values(15,'ookk','13645678922',sysdate);
insert into t7 values(16,'kkkk','13645678923',sysdate);
--查询:
SQL> select * from t7;
ID NAME TEL CREATED
--- ------ ----------- -------------------
12 eemm 13645678921 2016-10-23 14:35:49
13 13645678921 2016-10-23 14:35:49
14 13645678921 2016-10-23 14:35:49
15 ookk 13645678922 2016-10-23 14:35:50
16 kkkk 13645678923 2016-10-23 14:42:09
--更新2(只更新name字段:数据多的表t5往数据少的表t7跟新或插入):
SQL> merge into t7
2 using t5 on (t7.id=t5.id)
3 when matched then
4 update set t7.name = t5.name
5 when not matched then
6 insert (t7.id,t7.name) values(t5.id,t5.name);
5 rows merged.
SQL> select * from t7;
ID NAME TEL CREATED
--- ------ ----------- -------------------
12 eemm 13645678921 2016-10-23 14:35:49
13 hhss 13645678921 2016-10-23 14:35:49
14 hhll 13645678921 2016-10-23 14:35:49
15 ookk 13645678922 2016-10-23 14:35:50
16 kkkk 13645678923 2016-10-23 14:42:09
这样就是达到了预期的效果。
这两种的更新方法,都是为了整合两个数据不整齐表的数据,整合成一个比较完成、可读性高的数据表。
基本都是从数据多的表往数据少的数据表插入或者更新。
----相关更新的测试:
--创建两个测试表t4、t5:
SQL> create table t4(
2 id number(2),
4 name varchar2(6),
5 created date);
Table created.
SQL> create table t5(
2 id number(2),
4 name varchar2(6),
5 created date);
Table created.
--往两个表中插入数据:
insert into t4 values(12,'eemm',sysdate);
insert into t4 values(13,'',sysdate);
insert into t4 values(14,'',sysdate);
insert into t4 values(15,'ookk',sysdate);
insert into t5 values(12,'','');
insert into t5 values(13,'hhss',sysdate);
insert into t5 values(14,'hhll',sysdate);
insert into t5 values(15,'','');
--查看个表的数据:
SQL> select * from t4;
ID NAME CREATED
--- ------ -------------------
12 eemm 2016-10-21 18:04:18
13 2016-10-21 18:04:18
14 2016-10-21 18:04:18
15 ookk 2016-10-21 18:04:20
SQL> select * from t5;
ID NAME CREATED
--- ------ -------------------
12
13 hhss 2016-10-21 17:50:00
14 hhll 2016-10-21 17:50:00
15
--直接更新:
SQL> update t4 set name =(select name from t5 where t4.id=t5.id);
4 rows updated.
SQL> select * from t4;
ID NAME CREATED
--- ------ -------------------
12 2016-10-21 18:04:18
13 hhss 2016-10-21 18:04:18
14 hhll 2016-10-21 18:04:18
15 2016-10-21 18:04:20
这个更新明显是错误的。对于该例子,其实预计指向跟新2条数据的,但最后更新了4条,这表明给更新出问题了,
从查询的数据来看,更新后的name字段应该都有数据的。
有时候,感觉很爽快,以为是更新对了,直接commit提交了,但是最好要检查后的效果是不是预想的效果,
或者预计更新数据的条数,跟预期更新数据条数相差大的,可能就是更新错误的,这时候就要回滚到更新前的数据。
--正确的更新语句:
SQL> update t4 set name =(select name from t5 where t4.id=t5.id) where t4.name is null;
2 rows updated.
SQL> select * from t4;
ID NAME CREATED
--- ------ -------------------
12 eemm 2016-10-21 18:04:18
13 hhss 2016-10-21 18:04:18
14 hhll 2016-10-21 18:04:18
15 ookk 2016-10-21 18:04:20
所以这里提醒:生成环境中要进行大量数据的相关更新的时候,最好要先进行测试执行的语句是否为
正确的语句,更新后还要看看更新数据的效果,最后确定了,再提交任务,避免惹来麻烦。
----merge into更新方法:
--原表t5原来的数据:
SQL> select * from t5;
ID NAME CREATED
--- ------ -------------------
12
13 hhss 2016-10-21 17:50:00
14 hhll 2016-10-21 17:50:00
15
--测试表t6:
create table t6(
id number(2),
name varchar2(6),
created date);
--往表t6中插入数据:
insert into t6 values(12,'eemm',sysdate);
insert into t6 values(13,'hhss',sysdate);
insert into t6 values(14,'hhll',sysdate);
insert into t6 values(15,'ookk',sysdate);
insert into t6 values(16,'kkkk',sysdate);
SQL> select * from t6;
ID NAME CREATED
--- ------ -------------------
12 eemm 2016-10-23 15:17:06
13 hhss 2016-10-23 15:17:06
14 hhll 2016-10-23 15:17:06
15 ookk 2016-10-23 15:17:06
16 kkkk 2016-10-23 15:17:09
--更新1(只更新name字段:数据多的表t6往数据少的表t5跟新或插入):
SQL> merge into t5 t
2 using t6 d on (t.id=d.id)
3 when matched then
4 update set t.name = d.name
5 when not matched then
6 insert (t.id,t.name) values(d.id,d.name);
5 rows merged.
SQL> select * from t5;
ID NAME CREATED
--- ------ -------------------
12 eemm
13 hhss 2016-10-21 17:50:00
14 hhll 2016-10-21 17:50:00
15 ookk
16 kkkk
SQL> commit;
Commit complete.
新 表t5的数据也作为更新2的基表数据。
--创建测试表t7并查询:
create table t7(
id number(2),
name varchar2(6),
tel varchar2(11),
created date);
--插入数据:
insert into t7 values(12,'eemm','13645678921',sysdate);
insert into t7 values(13,'','13645678921',sysdate);
insert into t7 values(14,'','13645678921',sysdate);
insert into t7 values(15,'ookk','13645678922',sysdate);
insert into t7 values(16,'kkkk','13645678923',sysdate);
--查询:
SQL> select * from t7;
ID NAME TEL CREATED
--- ------ ----------- -------------------
12 eemm 13645678921 2016-10-23 14:35:49
13 13645678921 2016-10-23 14:35:49
14 13645678921 2016-10-23 14:35:49
15 ookk 13645678922 2016-10-23 14:35:50
16 kkkk 13645678923 2016-10-23 14:42:09
--更新2(只更新name字段:数据多的表t5往数据少的表t7跟新或插入):
SQL> merge into t7
2 using t5 on (t7.id=t5.id)
3 when matched then
4 update set t7.name = t5.name
5 when not matched then
6 insert (t7.id,t7.name) values(t5.id,t5.name);
5 rows merged.
SQL> select * from t7;
ID NAME TEL CREATED
--- ------ ----------- -------------------
12 eemm 13645678921 2016-10-23 14:35:49
13 hhss 13645678921 2016-10-23 14:35:49
14 hhll 13645678921 2016-10-23 14:35:49
15 ookk 13645678922 2016-10-23 14:35:50
16 kkkk 13645678923 2016-10-23 14:42:09
这样就是达到了预期的效果。
这两种的更新方法,都是为了整合两个数据不整齐表的数据,整合成一个比较完成、可读性高的数据表。
基本都是从数据多的表往数据少的数据表插入或者更新。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31392094/viewspace-2126960/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31392094/viewspace-2126960/