1. 问题描述

有同时反馈,直接通过如下的sql进行分页查询,分页会出现重复数据,于是乎我专门查了相关了资料,整理了一下。

-- 根据sort字段对dbname进行排序,每五百条数据一页
SELECT * FROM (
SELECT A.*, ROWNUM RN FROM (
select * from dbname
where createtime between '20211212' and '20211213') A
WHERE ROWNUM <=7000 )
WHERE RN >6500

2. 问题分析

可能的问题原因

2.1 Oracle 的 order by 是稳定排序么?

根据oracle官方文档:ORDER BY clauses,里边有针对排序是否稳定做了说明。

EQL保证语句的结果在查询中是稳定的。这意味着:

  • 如果没有执行更新,则即使没有指定ORDER BY子句,或者ORDER BY句中指定的顺序有联系,同一语句也会在重复查询时以相同的顺序返回结果。
  • 如果执行了更新,那么只有明确影响订单的更改才会影响订单;订单不会受到其他影响。订单可能会受到更改的影响,例如删除或插入有助于返回页面上或之前结果的记录,或修改用于分组或订购的值。

例如,在没有ORDER BY子句的语句中,使用PAGE(0, 10)然后是PAGE(10, 10)然后是PAGE(20, 10)查询,在没有更新的情况下,从同一任意但稳定的结果返回连续的10条记录。

对于带有更新的示例,在带有ORDER BY Num PAGE(3, 4)的语句中,初始查询返回记录{5、6、7、8}。然后,更新插入带有4的记录(在指定页之前),删除带有6的记录(在指定页上),并插入带有9的记录(在指定页之后)。更新后,同一查询的结果将为{4、5、7、8}。这是因为:

  • 插入4将所有后续结果向下移动一个。抵消3条记录包括新记录。
  • 删除6个班次会将所有后续结果增加一个。
  • 插入9不影响此结果之前或包含的任何记录。

从官方文档的描述来看,只要加上order by,那么在没有影响到该查询条件的更新或者写入操作,则排序是不受影响的,是稳定的。官方文档的描述比较符合我的预期,因为我觉得要是我去实现,我就会使用稳定排序的算法去实现,而不是非稳定算法。

我看网络上充斥着这片文章:Oracle——分页查询出现重复数据问题的分析与解决,该文章提到一个观点需要唯一索引才能够保证分页排序不会重复。我觉得看法太浅了,相当于提出了解决方案,但是不知道为什么能够解决没有了解,另外就是文章感觉个人主观猜想太强了,理论没有依据来源的感觉,可信度就感觉比较低。根据官方文档的说明,实际只要加上排序即可保证分页遍历是不会出现重复数据的。

3. 解决方法

3.1 通过排序分页

我想这是最高效的写法,只要在createtime 字段加上索引,则查询和排序都会利用到该索引。

-- 根据sort字段对dbname进行排序,每五百条数据一页
SELECT * FROM (
SELECT A.*, ROWNUM RN FROM (
select * from dbname
where createtime between '20211212' and '20211213'
order by createtime) A
WHERE ROWNUM <=7000 )
WHERE RN >6500

sql分页遍历出现重复数据原因与解决方案的更多相关文章

  1. sql输出表中重复数据

    数据: 1 1 2 32 2 2 33 1 2 34 2 2 35 2 1 36 1 1 37 3 2 1 表格查询: SELECT * FROM `t1`; 可以看到,如果界定为 a.b.c 都相同 ...

  2. 你真的会玩SQL吗?删除重复数据且只保留一条

    在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...

  3. SQL学习_查询重复数据和连接多个表数据的方法

    进行数据库测试时需要根据不同场景查询数据,以便验证发现的问题是否为脏数据引起的.记录一下最近常用的查询方法: 1. 查询表中重复数据(id不同,多个字段值相同) select P1.* from pr ...

  4. 面试题中经常遇到的SQL题:删除重复数据,保留其中一条

    如题,解决思路如下: 1.首先我们需要找出拥有重复数据的记录 ---以name字段分组 select Name,COUNT(Name) as [count] from Permission group ...

  5. android分页请求,重复数据如何处理

    1.如图 如图上的ks031数据,在数据请求时,第一次请求20条数据,再次加载下一页20条数据时,后台的数据处理导致ks031排序到了第2页,出现加载重复现象, 这种情况则是怎么处理? 有谁明白,求指 ...

  6. sql server: left join 重复数据

    ---涂聚文 2017-9-28 SELECT VipExamMailProjectId,VipExamMailStaffID FROM VipExamMailRecord WHERE VipExam ...

  7. SQL Server中删除重复数据

    delete from A ) )

  8. SQL查询返回去除重复数据的结果集

    方法一: select * from  tablename  where  id   in   (select  id  from  tablename   group  by  id   havin ...

  9. MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据

    开发背景: 最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性 ...

  10. js数组去除重复数据

    一个有重复数据的数组,准备一个空数组,遍历有重复数据的数组同时用indexOf对比那个空数组判断是否有一样的,不一样的push进去空数组 let arr = dataInfo.map(item =&g ...

随机推荐

  1. 【LeetCode排序专题01】由旋转数组的最小数字引出的关于排序算法的讨论(冒泡排序、二分查找+暴力法)

    旋转数组的最小数字 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一 ...

  2. 【Azure 存储服务】Azure Storage Account Queue中因数据格式无法处理而在一个小时内不在可见的问题

    问题描述 在从Storage Account 队列中获取数据(Queue),在门户中,明显看见有数据,但是通过消费端代码去获取的时候,就是无法获取到有效数据的情况.获取消息的代码如下: 问题解答 经过 ...

  3. C#多线程(11):线程等待

    目录 前言 volatile 关键字 三种常用等待 再说自旋和阻塞 SpinWait 结构 属性和方法 自旋示例 新的实现 SpinLock 结构 属性和方法 示例 等待性能对比 前面我们学习了很多用 ...

  4. C#系列文章索引

    由于有读者说,是否可以讲C#一类的文章都统一在一起,因此我做了个索引文章置顶起来,以后C#相关文章也会同步更新到该索引文章下,以便查找 .Neter所应该彻底了解的委托 - RyzenAdorer - ...

  5. C++ //类模板与函数模板的区别 //1.类模板没有自动类型推导的使用方式 //2.类模板子模板参数中可以有默认参数

    1 //类模板与函数模板的区别 2 //1.类模板没有自动类型推导的使用方式 3 //2.类模板子模板参数中可以有默认参数 4 5 #include <iostream> 6 #inclu ...

  6. netcat 命令介绍及使用示例

    netcat 命令介绍及使用示例 nc(netcat)是一个强大的网络工具,它可以用于读取和写入数据流,支持 TCP 和 UDP 协议.它常被用于网络调试和网络服务的创建. 一.安装方法 centos ...

  7. 图片动态操作,利用SeekBar控制属性示例,适配屏幕解决方案

    需求为,让图片适配屏幕大小,并且可以用一个滑块来控制图片的旋转,用一个滑块来控制图片大小,核心语法思路,控制图片的大小, 核心语法为:mImageView.setLayoutParams(new Li ...

  8. [学习笔记] Linux 环境下搭建基于Ngnix的反向代理服务

    ​之前为了方便同事测试微信小程序,搭建了基于CentOS的预发布环境,.Net5 程序也已经部署好在上面,在公网上可以通过http协议的临时域名(jevonsflash.xxx.net)访问到后台Ap ...

  9. 协议 UARST & 数据发送与接收

    STM32具有的协议 UASRT是通用异步/同步收发器,UART是通用异步收发器 串口空闲状态时高电平,开始传输数据时,第一个数据为固定的低电平: 数据:最后为高电平的停止位 奇偶校验:通过+1或者不 ...

  10. Nginx配置https 之 找不到 ./configure

    Nginx配置https 之 找不到 ./configure 需求 要配置个https 问题 找不到文件在哪里 教程很简单,发现就是找不到 ./configure 这个文件 这个文件是 安装包的文件, ...