有表A(char1,number1),记录巨多,求一SQL语句实现: 删除NUMBER1排名1000外的所有记录.

解决方案 »

  1.   

    呵呵,可以先把前1000导出来,再trunc掉表插进去
      

  2.   

    如果数据巨多的话,可以参考下1楼的方法,先将1000的数据insert到临时表,然后trunc掉原表,再从临时表insert回去
      

  3.   

    如果number1是索引,delete from biao where number1>1000应该也很快的
      

  4.   

    是order by number1吧, select * from biao where rownum <= 1000 order by number1 可以选出前1000名的.后面要根据主键判断用delete from biao where 数据不在其中的..
      

  5.   

    create table a_temp as select * from a where rownum<1;
    insert into a_temp select * from a where rownum <= 1000 order by number1 ;truncate table a;
    insert into a select * from a_temp;
    commit;
      

  6.   

    create table dd as (select top 1000 * from yourtable)
    truncate table yourtable
      

  7.   

    还有字段CHAR2='AAA'的判断条件,不是所有记录,所以一楼的先查询->TRUNC->插入的方法不是很理想.NUMBER1没建索引(CHAR2已经是索引被用上)
    To;derris(深水鱼) ( ) 信誉:100 ,你的语句应该不对,你可以做试验证明:
    select * from biao where rownum <= 1000 order by number1
      

  8.   

    delete from a where rownum>1000
      

  9.   

    还有字段CHAR2='AAA'的判断条件,不是所有记录,所以一楼的先查询->TRUNC->插入的方法不是很理想.NUMBER1没建索引(CHAR2已经是索引被用上)
    To;derris(深水鱼) ( ) 信誉:100 ,你的语句应该不对,你可以做试验证明:
    select * from biao where rownum <= 1000 order by number1
    顶一下,看看有没有高手给一个比较妥当的方法.
      

  10.   

    hehe ,尝试一下
    1. create table tab_1 as select * from (select * from tab_1 where char1 = 'AAA' order by number1) where rownum <= 1000  ;
    2. delete from A where char1 = 'AAA'; commit ;
    3. insert into A select * from tab_1 ; commit ;
      

  11.   

    需要楼主说清楚些,是NUMBER1的值在1000以外还是number1的值按从小到大的顺序排列后1000个以后的不要?
    如果前都那就简单了,
    create table b as select * from a where number1<1000
    drop table a
    rename b to a
    如果是NUMBER1排名1000的话不管怎么做已经肯定会table access full的,现在的问题是怎么才能使其order时快些,delete时快些。
    select * from 
    (select row_number() over(order by number1) n,a.* from a ) t
    where t.n<=1000
    上面的语句我在一个一千三百万记录数的表中测试过只需要70s左右
    注:凡是使用rownum语句作为排序条件都不对,rownum是对表访问过的记录数。