本人初玩ORACLE只会简单的SELECT INSERT
今天要做一个同步的脚本求助各位高手有三个表 T1 T2 T3 字段一样,结构相同
T1,T2已有记录,T3是空表
要求:用T1的记录INSERT到T2 如果T2没有这条记录就直接插入,如果T2已经有这条记录,就先把T2的记录INSERT到T3,然后删除T2的这条记录,再用T1的记录INSERT到T2。  T1记录的条数大约有100W 请各位大神帮忙啊。。脚本OracleStructureselect

解决方案 »

  1.   


    用T1的记录INSERT到T2 如果T2没有这条记录就直接插入--这里是插入T2还是T3?
      

  2.   

    用T1的记录INSERT到T2 如果T2没有这条记录就直接插入--这里是插入T2还是T3?
    插入T2其实就是用T1的记录来更新T2 ,T3是做为T2记录的备份表。
      

  3.   

    create or replace procedure test
     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;不知道是不是你想要的
      

  4.   

    个人感觉用SQL语句完成比较简单,首先把T1、T2重复的插入到T3中,
    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)
      

  5.   


    修改了一下这段脚本。实现了需求。
    建三个测试表
    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;可以实现了。只是目前小数据测试,不知道在正式库大数据上面会不会很慢。先谢谢,如果可以优化的地方欢迎继续指教。
      

  6.   

    百万数据,就脑袋里得有性能方面的考虑了,虽然数据不算太大。但要有这种意识。
    楼上的这段代码很土,完全是为实现功能而实现的。。可以用几条sql搞定
      

  7.   


    今天早上来的时候又重新想了一下。写了下面的一段
    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;
     
    新手,啥都不懂,完全自学多多指教哈哈,求好脚本。。
      

  8.   

    最后测试了一下。采用wushangjimo 的方法 1.141sec 处理了5万条数据。用dyboy0822 的方法已经 十分钟了还没有处理玩还在跑
      

  9.   


    今天早上来的时候又重新想了一下。写了下面的一段
    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搞定。差不多就是你这样了。