更正一下:
--2.exists
--------------------------------
INSERT INTO PhoneTmp(Phone,RoFlag)
select distinct Phone,'R'
from PhoneR
where rownum<1000
and not exists(select null from PhoneTmp a where trim(PhoneR.Phone) = a.Phone);
----^搞错 :-)
--3.MERGE
--------------------------------
MERGE INTO PhoneTmp A
USING (SELECT distinct Phone
FROM PhoneR
WHERE rownum<=1000) B
ON (trim(A.Phone) = B.Phone)
WHEN MATCHED THEN
DO NOTHING--这里我想不做处理
--^这里不知道怎么写才能达到不处理的目的
WHEN NOT MATCHED THEN
INSERT (A.Phone, A.RoFlag)
VALUES (B.Phone, 'R');

解决方案 »

  1.   

    MERGER INTO在处理大数据量时应该会效率高点吧,如果是1000条好像也不是太大,EXITS应该会比NOT IN效果好
      

  2.   

    不至1000条,每次10w条.
    我用第2种方法时得不到想要的唯一结果,出现插入重复记录的错误。
    第3种方法怎么让它略过符合条件(WHEN MATCHED THEN)那一步呢。
    3ks...
      

  3.   

    第一个效率很差是显然的第二个你的sql是错误的
    每次插入的是相同的纪录
    INSERT INTO PhoneTmp(Phone,RoFlag)
    select Phone,'R' from
    (select distinct Phone,'R'
    from PhoneR
    and not exists(select null from PhoneTmp a where trim(PhoneR.Phone) = a.Phone)) a
    where rownum<1000
    ;
      

  4.   

    merge语句必须要有WHEN MATCHED THEN 分支,这个语法规范问题,如果不要这个分支就没必要用merge语句,普通sql就可以实现了;另外merge原理跟forall -> (bulk collect)insert 方法类似,处理较大数据量时比普通insert语句效率高,可以考虑用forall -> (bulk collect)insert 方法实现
      

  5.   

    MERGE INTO PhoneTmp A
         USING (SELECT distinct Phone
                  FROM PhoneR
                 WHERE rownum<=1000) B
            ON (trim(A.Phone) = B.Phone)
          WHEN MATCHED THEN           
               SET A.phone = A.phone  //这样不是一样可以
          WHEN NOT MATCHED THEN
               INSERT (A.Phone, A.RoFlag)
               VALUES (B.Phone, 'R');
      

  6.   

    ORACLE交流群-22290972
    互相学习  互相提高
      

  7.   

    not in 在数据量大的情况下会极大的降低检索效率
      

  8.   

    not in 千万不要用,数据多时太慢,
    改成连接,或者in
      

  9.   

    晕,表名是动态的,执行SQL语句得用EXECUTE IMMEDIATE,游标不能用...
    那怎么用FORALL啊...
    SOS,3ks...