create table t1 as select * from  ly_res_name where not exists (select 1 from ly_mapping where ly_mapping.NE_UUID = ly_res_name.NE_UUID);insert into ly_mapping select * from t1;也可以2句并一句insert into ly_mapping (select * from  ly_res_name where not exists (select 1 from ly_mapping where ly_mapping.NE_UUID = ly_res_name.NE_UUID));

解决方案 »

  1.   

    我用的是oracle 9i的,不支持 exists
      

  2.   

    select * from ly_res_name u1
    WHERE u1.NE_UUID   NOT IN 
    (SELECT t1.NE_UUID FROM ly_mapping t1);
    =================================================
    你需要从这一段来入手.但是首先有一点是你必须你你的数据情况.表结构情况.以下执行计划帖出来.别人才好给你分析.比如NE_UUID是主键吗?等等的这些信息.
      

  3.   

    liuYouETong(易水寒) ( ) 信誉:100  2005-12-09 13:10:00  得分: 0  
     
     
       我用的是oracle 9i的,不支持 exists
      
     
    ====================================================呵呵!怎么可能不支持呢?
      

  4.   

    我的ORacle安装在unix下,以下是我运行的exists的结果:
    SQL> select count(*) from ly_res_name u1 where u1.ne_uuid not exists (select t.ne_uuid from ly_mapping t);select count(*) from ly_res_name u1 where u1.ne_uuid not exists (select t.ne_uuid from ly_mapping t)ORA-00920: invalid relational operatorSQL>
      

  5.   

    liuyi8903(tony) 
    我把我的MSN留下:
    希望你们能加我[email protected]
      

  6.   

    select count(*) from ly_res_name u1 where u1.ne_uuid not exists (select t.ne_uuid from ly_mapping t);
    需要改为
    select count(*) from ly_res_name u1 where not exists (select 1 from ly_mapping t where u1.ne_uuid=t.ne_uuid);
      

  7.   

    INSERT INTO ly_mapping 
    select * from  
      (
         select u1.*  from ly_res_name u1, ly_mapping t1
         WHERE u1.NE_UUID = t1.NE_UUID and t1.NE_UUID is null
      )
      

  8.   

    覺得樓主對Oracle還沒有學通,因為,其一,他不知道用EXISTS關鍵字,其二,他給出的用存儲過程插數據的方法太笨,過程中用到了兩個遊標,而且用到了兩個循環(嵌套),如果第一個遊標有130萬行,第二個遊標也有130萬行,那麼就得循環約130W*130W,再加上表如果沒有索引或分區或其它優化方式的話,那每掃描一次不知道要花多長時間,再循環約130W*130W次,那要花多少時間可想而知了!!!對於樓主的這個問題,可以從以下幾個方面優化:
    一、從ly_res_name表中查出要插入到ly_mapping表中的數據時,最好使用EXISTS關鍵字,不要使用IN,更加不能象樓主在存儲過程中那樣使用循環,這是大忌!!!;
    二、對於向ly_mapping表中插入數據,實際上可以看作是數據的導入導出,或者看作是表間數據復制(使用COPY命令),因此可以使用這兩種思想來進行數據插入工作,對於COPY命令,它要比使用INSERT命令的效率高出很多,速度很快;基於我的上述說明,我給出一個解決方案如下:
    COPY FROM 你的用戶名/你的密碼@你的全域數據庫SID TO 
    你的用戶名/你的密碼@你的全域數據庫SID APPEND ly_mapping(你的這個表的字段列表) USING 
    SELECT * FROM ly_res_name t1 WHERE NOT EXISTS(SELECT 1 FROM ly_mapping WHERE 
    NE_UUID=t1.NE_UUID);上面語句中的用戶名和密碼以及數據庫的SID要用你自己的實際情況填寫(如果ly_mapping表和ly_res_name表在同一個方案中,則隻要使用FROM或TO中的一項即可,當然也可全寫),使用COPY命令在表間復制數據是相當快的。