求一SQL语句!

yanedanny 2006-05-18 11:12:15
有表A(char1,number1),记录巨多,求一SQL语句实现: 删除NUMBER1排名1000外的所有记录.
...全文
227 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
超叔csdn 2006-05-24
  • 打赏
  • 举报
回复
提醒楼上的,你建的表a与原来饿表a会有点不同,因为那样会丢失主键,索引等。
mayongzhi 2006-05-23
  • 打赏
  • 举报
回复
需要楼主说清楚些,是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是对表访问过的记录数。
xiaoxiao1984 2006-05-23
  • 打赏
  • 举报
回复
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 ;
yanedanny 2006-05-23
  • 打赏
  • 举报
回复
还有字段CHAR2='AAA'的判断条件,不是所有记录,所以一楼的先查询->TRUNC->插入的方法不是很理想.NUMBER1没建索引(CHAR2已经是索引被用上)
To;derris(深水鱼) ( ) 信誉:100 ,你的语句应该不对,你可以做试验证明:
select * from biao where rownum <= 1000 order by number1
顶一下,看看有没有高手给一个比较妥当的方法.
lyjun_311 2006-05-21
  • 打赏
  • 举报
回复
delete from a where rownum>1000
xiaoxiao1984 2006-05-19
  • 打赏
  • 举报
回复
支持一楼
goldarcher2005 2006-05-19
  • 打赏
  • 举报
回复
不管是否有索引,1楼的方法最好
yanedanny 2006-05-19
  • 打赏
  • 举报
回复
还有字段CHAR2='AAA'的判断条件,不是所有记录,所以一楼的先查询->TRUNC->插入的方法不是很理想.NUMBER1没建索引(CHAR2已经是索引被用上)
To;derris(深水鱼) ( ) 信誉:100 ,你的语句应该不对,你可以做试验证明:
select * from biao where rownum <= 1000 order by number1
yz_oracle 2006-05-19
  • 打赏
  • 举报
回复
支持1楼
火龙岛主 2006-05-19
  • 打赏
  • 举报
回复
create table dd as (select top 1000 * from yourtable)
truncate table yourtable
火龙岛主 2006-05-19
  • 打赏
  • 举报
回复
你也可以增大回滚段的size
stncmaster 2006-05-18
  • 打赏
  • 举报
回复
呵呵,可以先把前1000导出来,再trunc掉表插进去
kingofworl 2006-05-18
  • 打赏
  • 举报
回复
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;
sunny2zhang 2006-05-18
  • 打赏
  • 举报
回复
具多是什么概念,远大于1000的话支持一楼
derris 2006-05-18
  • 打赏
  • 举报
回复
是order by number1吧,

select * from biao where rownum <= 1000 order by number1 可以选出前1000名的.后面要根据主键判断用delete from biao where 数据不在其中的..
dxbjeremy 2006-05-18
  • 打赏
  • 举报
回复
如果number1是索引,delete from biao where number1>1000应该也很快的
qiaozhiwei 2006-05-18
  • 打赏
  • 举报
回复
如果数据巨多的话,可以参考下1楼的方法,先将1000的数据insert到临时表,然后trunc掉原表,再从临时表insert回去

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧