准备阶段
1.建表语句:
1.建表语句:
create table table1(
idd varchar2(10) ,
val varchar2(20)
);
create table table2(
idd varchar2(10),
val varchar2(20)
);
2.插入数据:
insert into table1 values ('01','1111');
insert into table1 values ('02','222');
insert into table1 values ('02','2222');
insert into table1 values ('03','3333');
insert into table1 values ('04','4444');
insert into table1 values ('06','6666');
commit;
insert into table2 values ('01','aaaa');
insert into table2 values ('02','bbbb');
insert into table2 values ('03','cccc');
insert into table2 values ('04','dddd');
insert into table2 values ('05','eee');
commit;
3.两张表如下图:
要将 table2中idd - val 的值,赋值给table1对应的 idd - val;
为了验证操作的合理性,设置了如下几个需要额外考虑情况:
注意两表特殊地方在于:
idd
字段值为06
的数据,table2中idd
字段没有06
,命名为 e1
;idd
字段值都为02
,并且对应的val
不同的数据,命名为 e2
,以下都能正常解决此情况;idd
字段值都为05
,但对应的val
值不同的数据,命名为 e3
,待添加;update
,如下:update table1 set table1.val = (select val from table2 where table1.idd = table2.idd);
e1
情况,即table1中06
对应的值被改变了-->val变成了null(即图中的空白);idd
字段,不做修改;update table1 set val = (select val from table2 where table1.idd = table2.idd)
where exists (select 1 from table2 where table1.idd = table2.idd)
insert into table2 values ('03','ccc');
遇到了e3
情况,merge
,如下:merge into table1
using table2
on (table1.idd = table2.idd)
when matched then
update set table1.val = table2.val
e1
情况,然而遇到e3
情况时,仍然报错,如下:merge into table1
using (select t.idd ,max(t.val) m from table2 t group by t.idd)table2
on (table1.idd = table2.idd)
when matched then
update set table1.val = table2.m
using
后面构造了一个新的table2,但一定要对val做出处理,如果是varchar类型,可以选择 max,min等函数,如果number类型,可以使用sum,avg等函数,总之,要对val做出处理(对应多个的时候,到底要哪个?最大的还是最小的),新的table2是一个idd对应一个val。group by t.idd
,因为 select max(t.val) m from table2 t
查询的是一条数据,t.idd
不属于这条数据的任何字段,故select t.idd
后报错,拼接group by t.idd
便可以查出需要的idd字段。(针对oracle数据库,mysql并不会)参考:Oracle中用一个表的数据更新另一个表的数据
Group by 中avg();sum();min();max();count();的运用整理(Oracle的执行顺序)
另附:
oracle中merge into用法解析
Oracle表复制备份操作
转载地址:https://blog.csdn.net/u011009161/article/details/51334129
insert into b select * from a; – 需要实现创建好表,可以创建主键
create table b as select * from a; – 没有主键,没有索引,装入数据后创建主键较慢。
UpdateTime--2017年1月20日11:45:07
1.1.9.3 备份表数据
语法:
CREATE TABLE 表名_BAK/_日期 AS SELECT * FROM 要备份的表名
举例:
CREATE TABLE TABLE_BAK AS SELECT * FROM TABLE
应用场景:删除之前先做备份
--备份2017年符合条件的表数据 CREATE TABLE CONSULT_SCHEDULE_2017_BAK AS SELECT * FROM CONSULT_SCHEDULE T WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2017-01-01','yyyy-mm-dd') AND TO_DATE('2017-12-31','yyyy-mm-dd') AND T.ORG_ID='134557';
--备份好后再进行删除,以便备用 DELETE FROM CONSULT_SCHEDULE T WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2017-01-01', 'yyyy-mm-dd') AND TO_DATE('2017-12-31', 'yyyy-mm-dd') AND T.ORG_ID = '134557';