关于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条,进行循环操作!有可能在后续的使用中,不断的追加新数据,但不会更新数据! 展开
我的问题是,会不会在这个库进行增加数据的时候,出现这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条,进行循环操作!有可能在后续的使用中,不断的追加新数据,但不会更新数据! 展开
4个回答
展开全部
除了索引组织表(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 不会产生性能问题
所以 用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 语句
展开全部
如果不排序的话,很难实现你的需求,oracle有自己的排序规则,单纯通过rownum<=2000,不能保证每次检索的数据都是一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用rownum,最好在排序后使用,否则,结果的顺序难以保证,因为是oracle自己的顺序,这样使用不安全
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个用存储过程非常简单,为啥用SQl。存储过程把SQL写进去一个 loop 就完事啦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询