我有两个表,A和B;
A和B中有一个 hello 的字段,该字段在B表中是唯一的,在A表中不是;
A表中有50万条记录,B表中有1000万条记录;
现在我有个需求,我要从A表中拿出10W条记录,放到B表中去,请问如何处理?注意的是,A表的 hello 字段可以重复,而在B表是唯一的;之前考虑过,用唯一约束的异常来解决问题,但是效果不是很好。。

解决方案 »

  1.   

    lz是要实现去掉重复呢还是要让重复资料也进去,或者是把重复的hello处理成唯一值?
      

  2.   

    insert into b(hello)
    select hello 
      from tbl_a a
     where not exists (select 1 from tbl_b b where a.hello = b.hello)
     group by hello;
      

  3.   

    比如
    A表中 hello 字段有
    1  
    2  
    3  
    4  
    5  
    6
    7
    8
    9
    0
    1
    7
    8
    9
    0
    这十五条数据
    B表中hello有
    1
    3
    5
    7
    9
    这五条数据。。那么,我要从A中可以进入B表的数据就是hello不存在的数据。。
    比如 2 4 6 8 0。。
    但是我这实际应用数据量很大的,最少是百万以上。。求高手给出解决方案。。谢谢先。。
      

  4.   

    merge into 没有办法控制 10W条这个限制。
    --1、建一个和A表一模一样的临时表,并在hello上建索引
    create table tmp_A as select * from A where 1=2;
    create index tmp_a_idx1 on tmp_a(hello);
    --2、建立一个临时表tmp_b B表hello字段替冲,并加索引
    create table tmp_B as select distinct hello from B;
    create index tmp_b_idx1 on tmp_b(hello);--3、从A表中随即查出10W条 hello字段不重复的数据插入临时表 tmp_A
    INSERT INTO TMP_A
      SELECT 列出A表字段
        FROM (SELECT A.*,
                     ROW_NUMBER() OVER(PARTITION BY A.HELLO ORDER BY DBMS_RANDOM.VALUE) ROW_
                FROM A
               WHERE NOT EXISTS
               (SELECT 1 FROM TMP_B WHERE A.HELLO = TMP_B.HELLO))
       WHERE ROW_ = 1
         AND ROWNUM <= 100000;--4、将临时表Tmp_a中数据插入B表
    insert into B select * from Tmp_a;
      

  5.   


    (SELECT A.*,
                     ROW_NUMBER() OVER(PARTITION BY A.HELLO ORDER BY DBMS_RANDOM.VALUE) ROW_
                FROM A
               WHERE NOT EXISTS
               (SELECT 1 FROM TMP_B WHERE A.HELLO = TMP_B.HELLO))这条语句实行太慢了,里面有一千二百万条数据,请问有什么办法优化这句的效率吗?