Oracle中rownum和 order by联合使用导致排序错乱
2015-08-21 13:59
531 查看
在使用Oracle进行分页查询的时候,一般情况下我们都会携带很多参数。但是今天发现一个很奇怪的东西,当排序字段不是主键,且多条数据中该排序字段的值均相同的情况下,会出现分页查询的排序顺序和不分页查询的排序顺序不一样的情况。下面直接用SQL来说明一下:
1、原始的查询SQL
2、执行分页的查询SQL
注:分页查询的 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 ;
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 ;
相关文章推荐
- Oracle的ERP系统中报表不好用?
- Oracle的ERP系统中报表不好用?
- 修改spfile导致oracle无法启动
- Oracle 树操作(select…start with…connect by…prior)
- Oracle 对表的操作
- Oracle数据类型与.NET中的对应关系
- Oracle 六闪回技术,flashback
- Oracle 利用管道函数(pipelined)实现高性能大数据处理
- Linux(CentOS) Wget安装配置用户Oracle JDK
- Oracle 自定义数据类型Type
- "ORA-00942: 表或视图不存在 "的原因和解决方法
- 在Oracle中更新数据时,抛出:ORA-01008: not all variables bound
- JAVA读取Oracle数据库BLOB字段数据文件并保存到本地文件
- Oracle数据库的启动和关闭
- SQL-Oracle异常--java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配
- 从字符串中删除不需要的字符
- 计算字符在字符串中出现的次数
- Oracle中exp的使用2
- 在oracle中跟踪会话执行语句的几种方法
- oracle中字符中有数字的判断