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. virtualbox中给redhat安装增强功能

    关于虚拟机中安装redhat请参考其他教程: 1.点击虚拟机菜单:设备--安装增强功能.... 2.ssh连接到redhat,执行以下操作: [root@rhel-server ~]# mount / ...

  2. 像闪电般击碎天空吧——快速轻量化模型之 SDXL-Lightning

    SDXL-Lightning 是一个由 ByteDance(字节跳动) 开发的文本到图像的生成模型,其主要贡献在于其高速的生成能力和轻量化的设计. 模型的特点 快速生成:SDXL-Lightning ...

  3. ZYNQ核心板及其底板开源啦!

    Hello-FPGA ZYNQ 设计开源啦! 开源ZYNQ核心板 + 底板 硬件设计.软件设计,软件设计使用裸机演示,演示了如何使用AXI DMA等关键dma 模块 欢迎加QQ 讨论 94755958 ...

  4. 【Azure Developer】示例: 在中国区调用MSGraph SDK通过User principal name获取到User信息,如Object ID

    问题描述 示例调用MSGraph SDK通过User principal name获取到User信息,如Object ID. 参考资料 选择 Microsoft Graph 身份验证提供程序 : ht ...

  5. 【Azure Cloud Service】云服务升级后,查看配置文件发现编码变为utf-16

    问题描述 通过Migrate to ARM,把经典云服务升级成云服务(外延支持)后,在查看云服务的配置XML文件,发现文件的编码格式由 UTF-8 改变为 UTF-16 由此,引发了三个问题 1)Cl ...

  6. Java 包装类的使用(自动装箱+自动拆箱)+Vector

    1 package com.bytezreo.ut; 2 3 import java.util.Scanner; 4 import java.util.Vector; 5 6 /** 7 * 8 * ...

  7. 解决element-ui的date-picker组件的picker-options属性不生效的问题

    网上查半天都没查到,好像没人写,于是俺怀着激动的心情来记录下 项目来需求,说要控制日期选择的最大最小范围,看似简单,实则藏深坑! 小白的我天真地按照网上的例子(主要是官网也不给一个!)写完如下: 1. ...

  8. 一文学会JDBC实现java和mySQL的数据连接(尚硅谷学习课程代码+笔记+思路总结)

    JDBC是指数据库连接技术,用于java连接mySQL等数据库.本文详细介绍了尚硅谷课程中JDBC的学习内容和补充知识. 概述 java语言只提供规范接口,存在于java.sql.javax.sql包 ...

  9. 一款开源、免费、跨平台的Redis可视化管理工具

    前言 经常有小伙伴在技术群里问:有什么好用的Redis可视化管理工具推荐的吗?, 今天大姚给大家分享一款我一直在用的开源.免费(MIT License).跨平台的Redis可视化管理工具:Anothe ...

  10. Spring配置xml自定义事务管理器

    上一篇博客讲解了Spring配置xml事务,使用的是Spring框架提供的事务管理器. 在本篇博文当中,来讲解一下使用自定义的事务管理方式. 把上一篇博文当中的这个配置 <bean id=&qu ...