oracle分页查询结果集重复问题&解决方法

做项目时,无意间发现了分页上的一个bug,在此记录一下:

首先手动将后台输出的sql语句复制进oracle中查看,以便排查错误,对比以下视图前10条的结果集与10到20条的结果集,发现大部分记录出现重复现象,SQL语句如下:

--前10条记录
select *

  from (select row_.*, rownum rownum_

          from (select t.idcard, count(1)

                  from sampling.v_unvoucher_blacklist t

                 where 1 = 1

                 group by t.idcard

                 order by count(1) asc) row_

         where rownum <= 10)

 where rownum_ > 0;

--第11条-第20条记录
select *

  from (select row_.*, rownum rownum_

          from (select t.idcard, count(1)

                  from sampling.v_unvoucher_blacklist t

                 where 1 = 1

                 group by t.idcard

                 order by count(1) asc) row_

         where rownum <= 20)

 where rownum_ > 10;

出现以上错误时,先是反复增加/删除where之后的条件,不断测试,貌似发现了一些端倪,错误记录都发生在count(1)的值相同时,于是在网上好一阵搜索,可还是没有找到解决办法;

没办法了,最后还是硬着头皮去找官网的一些demo,从中观察用法,探索者、摸索着,就有了以下的版本,经测试可以返回正确结果集,修改后如下:

select *

  from (select row_1.*, rownum rownum_

          from (select * from (select t.idcard idcard, count(1) total

                  from sampling.v_unvoucher_blacklist t

                 where 1 = 1

                 group by t.idcard)

                 order by total,rownum asc) row_1

         where rownum <= 10)

 where rownum_ > 0;

总结:order by语句应当遵循条件唯一性原则,否则oracle不保证每次查询的结果集都相同。

详细介绍请参考oracle官网:

http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

oracle分页查询结果集重复问题&解决方法

时间: 2024-12-26 00:50:27

oracle分页查询结果集重复问题&解决方法的相关文章

Oracle分页查询排序数据重复问题

在项目开发过程中大量的使用了分页查询,当想要让数据按照日期排序时,出现了很多重复的数据出现. 造成这一问题出现的原因是:在数据中,日期的值不是唯一的. 我们知道 Oracle的分页查询是没有进行任何排序操作的,Oracle是顺序的从数据块中读取符合条件的数据返回到客户端. 而Oracle的排序算法不具有稳定性,也就是说,对于键值相等的数据,这种算法完成排序后,不保证这些键值相等的数据保持排序前的顺序. 解决这一问题的方法就是在后边增加一个唯一性列,比如主键,问题解决. select * from

oracle 分页查询数据重复问题

最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照顺序从数据中读取符合条件的数据返回到客户端,给用户误解为默认排序. 然而,当我加上排序的时候,还是查询有重复的数据,(指第一页数据在第二页也查询出来了),这是我就疑问了,当我检查数据的时候,发现我排序的字段有空的情况,而且有很多条,导致排序返回的 伪列并不是唯一的. 总结: oracle 分页查询数

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

ORACLE 分页查询

Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围.

MySQL中查询、删除重复记录的方法大全

前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: ? 1 select title,count(*) as count from user_table group by title having count>1; ? 1 SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER

yii下使用oracle中文都变成问号乱码的解决方法

在配置文件中,一般会用以下配置: 'db_oracle'=>array( 'class' => 'CDbConnection', 'connectionString'=>'oci:dbname=服务器地址/服务名', 'username'=>'用户名', 'password'=>'密码', 'charset' => 'utf8', 'enableParamLogging'=>true, ), 我试了千万遍,找了N久的资料,就是不行,在thinkphp中发现也没有什

powerDesigner 连接Oracle 报Unable to connect SQLState=08004 解决方法

powerDesigner 报Unable to connect SQLState=08004 解决方法 环境:win7(64) powersigner 15 oracle 10G 错误提示: Unable to connect SQLState=08004 [Oracle][ODBC][Ora]ORA-12154:TNS:无法解析指定的连接标示符 解决方法: 看看是不是把powerDesigner安装在了有空格的目录下,如果是重新安装在非空目录即可. 分类: windows 7 powerDe

查询数据库中重复记录的方法

select * from [DataBase].[dbo].[TableName] where [字段一] in (select [字段一] from [DataBase].[dbo].[TableName] group by [字段一] having count([字段一]) > 1) 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from peop

主键唯一键重复插入解决方法

[MySQL日记]主键唯一键重复插入解决方法 我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被允许有重复值: ? 1 CREATE TABLE stuInfo ( id INT NOT NULL COMMENT '序号', name VARCHAR(20) NOT NULL DEFAULT '' COMMENT '姓名', age INT NOT NULL DEFAULT 0 COMMENT '年龄', PRIMARY KEY (id), UNIQUE KEY uniq_n