ORACLE 导大数据混合使用rownum和order by引起的乱序问题

本文介绍了一种在SQL中使用orderby和rownum进行特定范围记录排序的方法,并对比了正确的排序语句与错误示例的区别,帮助读者理解如何避免常见的排序陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



原排序代码:
      select id ,rn from(
                   select id ,rownum rn from temp_org order by  id )
          where rn >10000 and rn <15000
由于原库是生成库,所以为了安全起见,我新建了一张临时表 :create table temp_org as select * from org,这个建表语句最大的好处就是可以非常简单的把数据从源表移动到新的临时表,但是却不能把主键,索引之类的带过来,只是一个简单的数据表。


order by和rownum同时使用时,只有id是primary key才会先执行order by,不然会优先给rownum赋值,所以以上语句查出来的结果会看到id是正序的,但是rownum乱序。


正确语句:
     select * from
  (select ORG_ID ,rownum rn from (
      SELECT 
          ORG_ID
      FROM TEMP_ORG order by org_id )order by rn )
  where   rn > 100000  and rn < 150000 


虽然是乱序,但是就我目前使用来看,好像问题不是非常大。由于安全,本次导数据只能先导出数据文件(SQL文件,CSV文件),然后再导入开发库,但是由于网络原因或者这个排序的原因(未确定原因,但是个人感觉网络丢包的可能性比较大),导致部分数据丢失。


向着更好的方向前进,希望本文帮到需要的人。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值