今天一大早业务人员就反映说用户导出的订单数据,有好几单是重复,并且缺失了某一单。

第一步:查询数据表。表里实际数据没有重复,也没有缺失。那么就可能是导出过程出错了(因为是异步分页导出,所以最先怀疑这部分代码)

第二步:复现问题(实际上遇到生产问题第一步就是复现问题,但是我忘了.... )

第三步:检查异步分页导出代码,简直是脏乱差一塌糊涂,但是运行没毛病(大多数代码都是如此,经过好几波素质不一程序员的蹂躏,再整洁的代码也会乱套)

第四步:检查查询语句

在第三步没问题之后,其实我就已经怀疑是分页问题了。

观察导出的数据,发现重复的记录都在两页分界的上下,比如记录A,它在第2页有一条记录,在第3页又有一条记录,但是不会在同一页出现两条相同记录。

导出分页是以 ORDER_DATE 字段排序,值都是 2025-01-13 00:00:00 这种,时分秒全是0,

如果是同一天的订单,那 ORDER_DATE 就都一样,排序相当于无效,每次查询结果的次序不固定,也就导致分页错乱了

On ROWNUM and Limiting Results 这篇文章中模拟了该问题

-- 创建表和数据
create table t as
select mod(level,5) id,
trunc(dbms_random.value(1,100)) data
from dual
connect by level <= 10000; -- 第1次查询
select *
from (
select a.*, rownum rnum
from (
select id, data
from t
order by id
) a
where rownum <= 150
)
where rnum >= 148; -- 第2次查询
select *
from (
select a.*, rownum rnum
from (
select id, data
from t
order by id
) a
where rownum <= 151
)
where rnum >= 148;

会发现第1次和第2次查询结果中,rownum 相同的数据并不相同,说明 rownum 并不固定。

One important thing about using this pagination query is that the ORDER BY statement should order by something unique. If what you are ordering by is not unique, you should add something to the end of the ORDER BY to make it so.

分页查询中重要的事情是,ORDER BY 语句应该有唯一性,如果 order by 字段不唯一,那么你也应该加上一些东西最终让它唯一。

ORACLE 分页排序后的数据重复或缺失问题的更多相关文章

  1. 已知内存BUF单元开始的区域中存放有一组无符号字节数据,要求将这些数据按从小到大的顺序排列,排序后的数据依然放在原来的存储区中。

    设计要求: 已知内存BUF单元开始的区域中存放有一组无符号字节数据,要求将这些数据按从小到大的顺序排列,排序后的数据依然放在原来的存储区中.(10分) #make_BIN# BUF DB 22,21, ...

  2. Oracle数据库排序后分页查询数据错误问题解决

    一.问题描述:根据更新时间倒序排序然后分页查询数据,但是点击分页操作的时候,会出现数据重复看似没有操作的情况 二.问题错误原因分析 分页查询的SQL语句: select * FROM (select ...

  3. Mysql分片后分页排序拉取数据的方法

    高并发大流量的互联网架构,一般通过服务层来访问数据库,随着数据量的增大,数据库需要进行水平切分,分库后将数据分布到不同的数据库实例(甚至物理机器)上,以达到降低数据量,增加实例数的扩容目的. 一旦涉及 ...

  4. oracle分页排序,点击下一页数据不刷新

    oracle数据库中,如果每一页的最后一条和次页第一条数据的排序字段重复,会导致排序混乱,出现点击下一页数据不刷新的现象,所以一般排序至少选择一个相对唯一的字段.在前端页面可以输入排序条件的场景中,最 ...

  5. Oracle 分页、取期间数据、TOP前几

    Oracle没有 sqlserver的 top number 功能.只能以期间的形式实现 代码实现分页,参数curPage 当前页.pageSize 每页行数,计算出起始结束页码 int startP ...

  6. oracle获取排序第一的数据

    一:按照某字段排序(时间,总数等),获取第一条 select a.* FROM ( select * from ( select t.*,row_number() over(partition by ...

  7. oracle获取排序后的第一条信息

    查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...

  8. oracle查询排序后的前几条记录

    select * from (select * from table order by 字段名 desc) where rownum<你要查的记录条数,这样才能符合条件.

  9. laravel中get方式表单提交后, 地址栏数据重复的问题

    csrf_field这个要放form表单下面第一行的位置

  10. EF 数据重复和缺失问题(select 错误 )

    字段有 id,name,password,sex 1.错误举例: var data = db.User.Select(d => d):   2修正 var data = db.User.Sele ...

随机推荐

  1. AI产品落地的多角度探索与实践

    AI产品落地的多角度探索与实践是一个复杂而多维的过程,它涉及技术创新.行业应用.人机协作等多个方面.在构建多智能体平台Agent Foundry的基础上,我们可以将其应用于制造业.教育.政府.跨境电商 ...

  2. 【杂谈】如何选择:Session 还是 JWT?

    服务端如何验证客户端已经登录? 在用户成功登录后,服务端会发放一个凭证.之后,客户端的每次请求都需要携带该凭证,服务端通过验证凭证的有效性来判断用户是否已登录,并处理请求. 以下是 Session 和 ...

  3. idea properties文件乱码解决

    ​java文件是好的,但是遇到properties文件,默认就成了iso制式乱码了. 虽说不影响程序执行,但是看起来真的让人心烦. 问题点是出在properties文件是GBK的,需要单独设置一下. ...

  4. C#字符串拼接的几种方式及其性能分析对比

    前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询.构建日志信息.格式化用户显示内容等.然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异.今天咱们 ...

  5. fabric2.0开发 部署fabric环境和fabric-samples的启动(2)

    通过上一篇文章我们已经将fabric的基本环境搭建成功,接下来我们开始运行使用并初步认识fabric. 创建项目目录 mkdir -p ~/go/src/github.com/hyperledger ...

  6. 判断移动终端类型安卓苹果鸿蒙、查看设备详细信息、跳转到各手机应用商店、判断APP是否已安装

      案例1:判断移动终端类型,微信扫描二维码链接可以区分华为(荣耀).安卓.苹果手机.华为及荣耀会跳到华为应用商店.安卓会提示浏览器打开.苹果跳到苹果商店. <!DOCTYPE html> ...

  7. Qt编写的项目作品11-带频谱的音乐播放器

    一.功能特点 可获取整个声音文件采样值数据 可实时获取当前播放位置的采样值数据 可设置采样的步长和数量 可开始播放/暂停播放/停止播放 多线程处理,超流畅 可设置当前播放位置 可设置和调节音量 支持任 ...

  8. Qt编写安防视频监控系统43-图片回放

    一.前言 之前就已经具备了本地回放.远程回放.设备播放3个模块,其中本地回放用来回放存储在软件本地电脑上的视频文件:远程回放需要通过调用厂家sdk或者GB28181(没实现,后期考虑增加)从NVR回放 ...

  9. Qt编写的项目作品21-网络请求客户端/服务器

    一.实现原理 http请求就是tcp通信,所以第一步实例化QTcpServer类监听端口,并绑定newConnection信号槽. 一旦有新的连接,交给专门的解包类处理,将对应的数据解包,http请求 ...

  10. 记一次语音合成遇到的坑:PCM音频流转WAV

    需求内容: 预合成音:支持将固定音合成并完成上传操作 解决思路: 调用公有云识别引擎,获取识别引擎合成的音频流, 然后将音频流转成wav文件, 最后将文件上传到oss服务器上. 遇到的问题 问题主要在 ...