关于oracle中使用rownum的问题

现在只需要取表中前2000条,因表数据较大,不能使用orderby,只需要我定位这2000条,在后续的操作中,没有修改操作,只进行针对这2000条的删除,也就是说,我查询... 现在只需要取表中前2000条,因表数据较大,不能使用order by,只需要我定位这2000条,在后续的操作中,没有修改操作,只进行针对这2000条的删除,也就是说,我查询的只是表的入库顺序,操作也是暂定这2000条,使用完后,进行删除!
我的问题是,会不会在这个库进行增加数据的时候,出现这2000条数据的变化,导致后续删除的不是这2000条数据!
我的sql语句是:
取数:select * from table_a where rownum <= 2000
删除:delete from table_a where 主键 in (select 主键 from (select * from table_a where rownum <=2000))
这边测试中,发现select * from table_a where rownum <= 2000和select 主键 from table_a where rownum <= 2000这二条语句查询的语句还不一样!
所以,我想问下,在实际项目中使用的过的朋友,rownum存不存在数据异常的风险!
最后在说下需求,只取表的前2000条数据,(内存处理完后),删除这2000条,再取2000条,进行循环操作!有可能在后续的使用中,不断的追加新数据,但不会更新数据!
展开
 我来答
wanyd937
2012-11-16 · TA获得超过234个赞
知道小有建树答主
回答量:71
采纳率:0%
帮助的人:84.6万
展开全部
除了索引组织表(IOT),其他的表存储都是堆表(Heap表)是无序的,查询出的数据不一定就是入库顺序,切记
所以 用rownum 最好加上order by
解决方案:
查询:
select * from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
删除:
delete from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
这里按照id 排序,因为id是有索引的,索引本身就是有序的,所以 order by id 不会产生性能问题
追问
为什么
delete from table where id in (select id from table where rownum <= 10 order by id) 会失败?

delete from table where id in (select id from (select * from table where rownum <= 10 order by id))才能删呢?
追答
在in 里面的子查询不能有order by 语句
arthur37
2012-11-16 · TA获得超过1372个赞
知道小有建树答主
回答量:668
采纳率:75%
帮助的人:425万
展开全部
如果不排序的话,很难实现你的需求,oracle有自己的排序规则,单纯通过rownum<=2000,不能保证每次检索的数据都是一样的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
星辰大海byj
2012-11-16 · TA获得超过1020个赞
知道小有建树答主
回答量:993
采纳率:100%
帮助的人:530万
展开全部
使用rownum,最好在排序后使用,否则,结果的顺序难以保证,因为是oracle自己的顺序,这样使用不安全
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
killertab
2012-11-16
知道答主
回答量:46
采纳率:0%
帮助的人:20.1万
展开全部
你这个用存储过程非常简单,为啥用SQl。存储过程把SQL写进去一个 loop 就完事啦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式