首页 > 数据库技术 > 详细

Oracle中rownum和 order by联合使用导致排序错乱

时间:2015-08-21 15:46:37      阅读:431      评论:0      收藏:0      [点我收藏+]

       在使用Oracle进行分页查询的时候,一般情况下我们都会携带很多参数。但是今天发现一个很奇怪的东西,当排序字段不是主键,且多条数据中该排序字段的值均相同的情况下,会出现分页查询的排序顺序和不分页查询的排序顺序不一样的情况。下面直接用SQL来说明一下:

1、原始的查询SQL

select ty.countryname,ty.s_adddate  from  t_d_Country ty order by ty.s_adddate desc;

2、执行分页的查询SQL

select * from (select m.*,ROWNUM rn from ("+sql+") m where ROWNUM <=${count}) where rn>${offset}

注:分页查询的 sql中的变量sql的值为1中原始查询SQL

3、当执行2中的SQL进行分页查询的时候,我们会以为他是按照s_adddate降序排列的。但是当s_adddate的值是一样的时候,他会怎么样呢。比如说取前十条数据,我们会发现执行步骤1中的SQL获得的前十条数据和执行步骤2中的SQL获得的前十条数据竟然不是完全一样的。

原因分析:

经过对比SQL执行计划发现,当步骤2的SQL在使用ROWNUM <=${count}这个的过程中,整个列表的rownum的值就会产生变化。PS:内部原因尚未研究出来

解决方案:

在我们使用rownum获取行号的时候,先对其进行一个升序排序,然后再对rownum的值进行限制,这样就能保证不执行分页的SQL和执行分页的SQL在相同排序字段和相同排序规则下,数据的顺序是一致的。具体SQL如下:

select *  from (select t.*,rownum  from  (select ty.countryname,ty.s_adddate  from  t_d_Country ty order by ty.s_adddate desc) t  order by rownum) where rownum <270 ;







版权声明:转载请注明博文地址,尊重作者劳动成果。欢迎关注http://blog.csdn.net/zgs_shmily,一起成长。

Oracle中rownum和 order by联合使用导致排序错乱

原文:http://blog.csdn.net/zgs_shmily/article/details/47833313

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!