sql分页遍历出现重复数据原因与解决方案
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. 问题分析
可能的问题原因
- 数据库本身有重复数据:经排查,表结构有唯一索引,不存在重复数据
- 分页数据有交集:根据这个问题:What is the default order of records for a SELECT statement in MySQL?,里边的高赞回答可知,sql-92标准中指明如果没有排序,那么返回数据的顺序将由数据库实现决定。
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分页遍历出现重复数据原因与解决方案的更多相关文章
- 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 都相同 ...
- 你真的会玩SQL吗?删除重复数据且只保留一条
在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...
- SQL学习_查询重复数据和连接多个表数据的方法
进行数据库测试时需要根据不同场景查询数据,以便验证发现的问题是否为脏数据引起的.记录一下最近常用的查询方法: 1. 查询表中重复数据(id不同,多个字段值相同) select P1.* from pr ...
- 面试题中经常遇到的SQL题:删除重复数据,保留其中一条
如题,解决思路如下: 1.首先我们需要找出拥有重复数据的记录 ---以name字段分组 select Name,COUNT(Name) as [count] from Permission group ...
- android分页请求,重复数据如何处理
1.如图 如图上的ks031数据,在数据请求时,第一次请求20条数据,再次加载下一页20条数据时,后台的数据处理导致ks031排序到了第2页,出现加载重复现象, 这种情况则是怎么处理? 有谁明白,求指 ...
- sql server: left join 重复数据
---涂聚文 2017-9-28 SELECT VipExamMailProjectId,VipExamMailStaffID FROM VipExamMailRecord WHERE VipExam ...
- SQL Server中删除重复数据
delete from A ) )
- SQL查询返回去除重复数据的结果集
方法一: select * from tablename where id in (select id from tablename group by id havin ...
- MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
开发背景: 最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性 ...
- js数组去除重复数据
一个有重复数据的数组,准备一个空数组,遍历有重复数据的数组同时用indexOf对比那个空数组判断是否有一样的,不一样的push进去空数组 let arr = dataInfo.map(item =&g ...
随机推荐
- java类初始化及代码块加载顺序连根拔起
说明 相信很多人对于java中父子继承关系中,子类实例化调用过程中,代码块的执行顺序都容易忘记或搞混,尤其是java初级笔试题或面试题最容易出这类题目,让人恨得牙痒痒!!! 本文就一次性将其连根铲除, ...
- Java并发编程实例--16.使用ReentrantLock实现线程同步
Java提供另一机制去同步代码块.它比synchronized关键字更强大且易用. 它是基于Lock接口和其实现类例如:ReentrantLock. 这一机制对比synchronized关键字的优势在 ...
- Direct2D CreateBitmap的使用
当需要设置位图的混合模式时,应该使用ID2D1DeviceContext而不是ID2D1RenderTarget. 代码如下: #define WIN32_LEAN_AND_MEAN #include ...
- Go微服务框架go-kratos实战学习08:负载均衡基本使用
微服务框架 go-kratos 中负载均衡使用 一.介绍 在前面这篇文章 负载均衡和它的算法介绍,讲了什么是负载均衡以及作用.算法介绍. go-kratos 的负载均衡主要接口是 Selector,它 ...
- 负载均衡load balancing和算法分类概要介绍
一.负载均衡介绍 1.1 什么是负载均衡 负载均衡(load balancing) 它是计算机的一种技术,用来在计算机集群.网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到优化资源使用.最大化 ...
- IDA 常用快捷键记录
常用快捷键1 1.切换文本视图与图表视图 空格键 2.返回上一个操作地址 ESC 3.搜索地址和符号 G 4.对符号进行重命名 N 5.常规注释 冒号键 6.可重复注释 分号键 7.添加标签 Alt+ ...
- 统信UOS系统开发笔记(五):安装QtCreator开发IDE中的中文输入环境Fcitx输入法
前言 中文输入法,QtCreator中无法输入中文也是ubuntu中一个常规问题,在国产银河麒麟系统中也有此问题(PS:最终无法结局,用文本自行贴),国产UOS也有此问题,本片要解决此问题,主要是 ...
- STM32标准库时钟树设置
STM32的系统时钟大致可以分为以下流程 1.外部晶振提供HSE高速外部时钟信号 2.HSE经过PLL锁相环,倍频后得到PLL_CLK高速内部时钟信号 3.PLL_CLK经过分频后得到系统时钟SYSC ...
- spark 下java list 或者scala list 转DataFrame or DataSet 总结
一.JAVA list 转 DataFrame or DataSet case class CaseJava( var num: String, var id: String, var start_t ...
- book 电子书转换 在线工具
https://convertio.co/download/911d3a3f39db0b2e39ed6e3c8acb31f6be786a/ Convertio