昨天,与外部化系统对接时,发现有一个数据一直咩有集成到,双方各自排查了自己系统的代码,都觉得逻辑非常简单,无法就是一个分页查询而已。

  问题就出在这个分页查询上。

  为了说明当时问题发生的情景,我模拟了一个SQL查询:

  

  以上是一段典型的Oracle数据库的分页查询,又以查询结果集的第1条至第800条数据。

  如果想查询第二页的数据,只需要改到RN和ROWNUM即可。以下是查第二页的数据的SQL:

  

  

  问题背景

  上述SQL中从MY_TABLE查询结果集本身是没有问题的,因为符合条件的数据总数是不会变的。但是有一个问题,从MY_TABLE查询的结果集是没有做排序的,意味着每次查询的数据的位置可能发生变化。由于分页查询,其实是从MY_TABLE查询查询了多次,每次数据的位置不确定,导致查询出来的结果,有可能查得出来,有可能查询重复。这就是问题的根源。

  解决方案

  知道问题所在解决起来就简单了,就是加排序。让每次查询出来的数据按到固定位置查出来就没有了。以下是示例:

  

  一般来说,排序的字段最好是唯一值。如果是非唯一的字段,那么最好用多个能确定唯一性的字段来实现排序也是可以的。否则无法启动排序的效果,问题还是会出现。

最新文章

  1. 解决Failed to allocate memory: 8转
  2. 浏览器默认样式(User Agent Stylesheet)
  3. 前端与php的sublime text3常用插件
  4. 关于mysql 连接数
  5. 并发下常见的加锁及锁的PHP具体实现
  6. ECMall关于数据查询缓存的问题
  7. UVA 11802 All Your Bases Belong to Us
  8. 解决php下多人同时操作数据表
  9. Codeforces543BDestory Roads心得
  10. HIve:beeline终端上在输错hive语句时,无论 Backspace还是delete 都删除不掉错误的语句,没有办法退格
  11. Docker下安装GitLab
  12. 实训任务04 MapReduce编程入门
  13. python 接口自动化测试二(request.get)
  14. 001.Postfix简介
  15. Scala偏函数与部分函数
  16. shell小记
  17. 数据库日志文件(databasename_log.ldf)太大 如何清除
  18. [AngularJS] Angular 1.3 ngMessages with ngAnimate
  19. [Linux] 一次SSH认证失败引发的关于通过日志查错误的思考
  20. PHP中常用的输出语句比较?

热门文章

  1. vue二、脚手架搭建
  2. 303. Range Sum Query - Immutable(动态规划)
  3. Orange Greenworks
  4. 创建 Visual Studio 2017 离线安装
  5. .Net与 WebAssembly 随笔
  6. C# rtsp 转码rtmp nginx踩下的坑
  7. Hadoop Mapreduce 调优
  8. Keepalived配置文件详解
  9. CCF CSP 201712-1 最小差值
  10. ORA-12557协议适配器不可加载