本人初玩ORACLE只会简单的SELECT INSERT
今天要做一个同步的脚本求助各位高手有三个表 T1 T2 T3 字段一样,结构相同
T1,T2已有记录,T3是空表
要求:用T1的记录INSERT到T2 如果T2没有这条记录就直接插入,如果T2已经有这条记录,就先把T2的记录INSERT到T3,然后删除T2的这条记录,再用T1的记录INSERT到T2。 T1记录的条数大约有100W 请各位大神帮忙啊。。脚本OracleStructureselect
今天要做一个同步的脚本求助各位高手有三个表 T1 T2 T3 字段一样,结构相同
T1,T2已有记录,T3是空表
要求:用T1的记录INSERT到T2 如果T2没有这条记录就直接插入,如果T2已经有这条记录,就先把T2的记录INSERT到T3,然后删除T2的这条记录,再用T1的记录INSERT到T2。 T1记录的条数大约有100W 请各位大神帮忙啊。。脚本OracleStructureselect
用T1的记录INSERT到T2 如果T2没有这条记录就直接插入--这里是插入T2还是T3?
插入T2其实就是用T1的记录来更新T2 ,T3是做为T2记录的备份表。
as
cursor var_c1 is select * from A1;
cursor var_c2 is select * from A2;
begin
for temp1 in var_c1 loop
for temp2 in var_c2 loop
if temp1.aid = temp2.aid then
insert into A3(aid,aname,age) values(temp2.aid,temp2.aname,temp2.age);
delete A2 a2 where a2.aid = temp2.aid;
insert into A2(aid,aname,age) values(temp1.aid,temp1.aname,temp1.age);
end if;
end loop;
end loop;
end;不知道是不是你想要的
INSERT INTO t3(id,column1,column2) SELECT t2.id,t2.coulmn1,t2.coulmn2 FROM t2,t1 WHERE t2.id=t1.id
之后就有两种情况,如果t1与t2重复记录较多,那就根据t1更新t2,否则就把重复的给删掉,然后t1全部插入t2.代码分别是:UPDATE t2 SET(id,column1,column2)=(SELECT t2.id,t2.coulmn1,t2.coulmn2 FROM t2,t1 WHERE t2.id=t1.id);DELETE t2 WHERE exists(SELECT 1 FROM t1 WHERE t1.id=t2.id)
最后就是插入了,如果第二步是删除,那就简单了INSERT INTO t2(id,column1,column2) SELECT t2.id,t2.coulmn1,t2.coulmn2 FROM t1
如果第二步是更新,那也简单INSERT INTO t2(id,column1,column2) SELECT t2.id,t2.coulmn1,t2.coulmn2 FROM t1 WHERE not exists(SELECT 1 FROM t1 WHERE t1.id=t2.id)
修改了一下这段脚本。实现了需求。
建三个测试表
create table cxk_test_syn_01
(pid number(3),
product_id number
)
插入测试数据到表1表2
declare
i number;
begin
i:=0;
for i in 1..15 loop
insert into cxk_test_syn_01 values (i,dbms_random.value(1,10000000000));
end loop;
end;
/
commit;
跑修改后的脚本。
declare
cursor var_c1 is select * from cxk_test_syn_01;
cursor var_c2 is select * from cxk_test_syn_02;
begin
for cxktemp1 in var_c1 loop
for cxktemp2 in var_c2 loop
if cxktemp1.pid = cxktemp2.pid then
insert into cxk_test_syn_03(pid,product_id) values (cxktemp2.pid,cxktemp2.product_id);
delete cxk_test_syn_02 t where t.pid = cxktemp2.pid;
end if;
end loop;
insert into cxk_test_syn_02(pid,product_id) values (cxktemp1.pid,cxktemp1.product_id);
end loop;
end;
/
commit;select * from cxk_test_syn_01;
select * from cxk_test_syn_02;
select * from cxk_test_syn_03;可以实现了。只是目前小数据测试,不知道在正式库大数据上面会不会很慢。先谢谢,如果可以优化的地方欢迎继续指教。
楼上的这段代码很土,完全是为实现功能而实现的。。可以用几条sql搞定
今天早上来的时候又重新想了一下。写了下面的一段
begin
insert into cxk_test_syn_03 select * from cxk_test_syn_02 where exists (select 1 from cxk_test_syn_02 b,cxk_test_syn_01 a where a.pid=b.pid);
delete cxk_test_syn_02 where exists (select 1 from cxk_test_syn_02 b,cxk_test_syn_01 a where a.pid=b.pid);
insert into cxk_test_syn_02 select * from cxk_test_syn_01;
end;
/
commit;
新手,啥都不懂,完全自学多多指教哈哈,求好脚本。。
今天早上来的时候又重新想了一下。写了下面的一段
begin
insert into cxk_test_syn_03 select * from cxk_test_syn_02 where exists (select 1 from cxk_test_syn_02 b,cxk_test_syn_01 a where a.pid=b.pid);
delete cxk_test_syn_02 where exists (select 1 from cxk_test_syn_02 b,cxk_test_syn_01 a where a.pid=b.pid);
insert into cxk_test_syn_02 select * from cxk_test_syn_01;
end;
/
commit;
新手,啥都不懂,完全自学多多指教哈哈,求好脚本。。我上面说的可以用几条sql搞定。差不多就是你这样了。