ORACLE 分页排序后的数据重复或缺失问题
今天一大早业务人员就反映说用户导出的订单数据,有好几单是重复,并且缺失了某一单。
第一步:查询数据表。表里实际数据没有重复,也没有缺失。那么就可能是导出过程出错了(因为是异步分页导出,所以最先怀疑这部分代码)
第二步:复现问题(实际上遇到生产问题第一步就是复现问题,但是我忘了.... )
第三步:检查异步分页导出代码,简直是脏乱差一塌糊涂,但是运行没毛病(大多数代码都是如此,经过好几波素质不一程序员的蹂躏,再整洁的代码也会乱套)
第四步:检查查询语句
在第三步没问题之后,其实我就已经怀疑是分页问题了。
观察导出的数据,发现重复的记录都在两页分界的上下,比如记录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 分页排序后的数据重复或缺失问题的更多相关文章
- 已知内存BUF单元开始的区域中存放有一组无符号字节数据,要求将这些数据按从小到大的顺序排列,排序后的数据依然放在原来的存储区中。
设计要求: 已知内存BUF单元开始的区域中存放有一组无符号字节数据,要求将这些数据按从小到大的顺序排列,排序后的数据依然放在原来的存储区中.(10分) #make_BIN# BUF DB 22,21, ...
- Oracle数据库排序后分页查询数据错误问题解决
一.问题描述:根据更新时间倒序排序然后分页查询数据,但是点击分页操作的时候,会出现数据重复看似没有操作的情况 二.问题错误原因分析 分页查询的SQL语句: select * FROM (select ...
- Mysql分片后分页排序拉取数据的方法
高并发大流量的互联网架构,一般通过服务层来访问数据库,随着数据量的增大,数据库需要进行水平切分,分库后将数据分布到不同的数据库实例(甚至物理机器)上,以达到降低数据量,增加实例数的扩容目的. 一旦涉及 ...
- oracle分页排序,点击下一页数据不刷新
oracle数据库中,如果每一页的最后一条和次页第一条数据的排序字段重复,会导致排序混乱,出现点击下一页数据不刷新的现象,所以一般排序至少选择一个相对唯一的字段.在前端页面可以输入排序条件的场景中,最 ...
- Oracle 分页、取期间数据、TOP前几
Oracle没有 sqlserver的 top number 功能.只能以期间的形式实现 代码实现分页,参数curPage 当前页.pageSize 每页行数,计算出起始结束页码 int startP ...
- oracle获取排序第一的数据
一:按照某字段排序(时间,总数等),获取第一条 select a.* FROM ( select * from ( select t.*,row_number() over(partition by ...
- oracle获取排序后的第一条信息
查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...
- oracle查询排序后的前几条记录
select * from (select * from table order by 字段名 desc) where rownum<你要查的记录条数,这样才能符合条件.
- laravel中get方式表单提交后, 地址栏数据重复的问题
csrf_field这个要放form表单下面第一行的位置
- EF 数据重复和缺失问题(select 错误 )
字段有 id,name,password,sex 1.错误举例: var data = db.User.Select(d => d): 2修正 var data = db.User.Sele ...
随机推荐
- 超详细 HarmonyOS 开发教程之开发环境搭建指南
HarmonyOS开发环境搭建指南:DevEco Studio安装教程 一.系统要求 操作系统:Windows 10 64位或更高版本 RAM:至少8GB,推荐16GB 硬盘空间:至少10GB可用空间 ...
- DTL事务控制语言--sql事务
DTL事务控制语言体格sql语句就是一个事务事务可以保证 一组sql语句要么都成功,要么都失败默认自动提交一可以关闭 set autocommit=0关闭自动提交最后 插入或者修改时 只有commit ...
- Mysql8.0修改配置参数lower_case_table_names
现象 今天在配置一个环境的数据库,所使用的系统要求该数据库 lower_case_table_names = 1 (对数据库表明.列名大小写不敏感) 我看了一下,在 Windows 上,默认值为 1. ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-7-元素基础定位方式-下篇 (详细教程)
1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的基础定位方式的理论基础知识以及在什么情况下推荐使用.今天这一篇讲解和分享一下剩下部分的基础定位方式. 2. ...
- 【Python】【爬虫】【爬狼】004_正则规则模板及其应用
# 正则规则模板 与 应用(一) 先看这些视频,是在哪个div里面的 for datapage in soup.find_all("div", class_="lpic& ...
- 【Spring】Sring基础概念(黑马SSM学习笔记)
目录 Spring简介 Spring是什么 Spring发展 Spring优势 Spring体系结构 Spring快速入门 Spring程序开发步骤 不用Spring的一般步骤 使用Spring框架 ...
- 离线部署yum依赖
利用本地源解决在无网环境部署应用需要解决的问题: 应用需要哪些软件包? 如何把应用依赖的软件包制作成一个精简的本地源? 如何使用本地源? 第一个问题使用yum-utils解决,它带的repotrack ...
- Qt编写的项目作品11-带频谱的音乐播放器
一.功能特点 可获取整个声音文件采样值数据 可实时获取当前播放位置的采样值数据 可设置采样的步长和数量 可开始播放/暂停播放/停止播放 多线程处理,超流畅 可设置当前播放位置 可设置和调节音量 支持任 ...
- VC++2008、2010、2012、2015、2017等IDE中如何设置命令行参数进行程序调试
有时我们在写程序时会从命令行中直接读入参数,形如: int main(int argc,char**argv){ //your code here return 0; } 其实在vc2010 IDE中 ...
- 并发和并行 | Python中实现多线程 threading 和多进程 multiprocessing
并发和并行 | Python中实现多线程 threading 和多进程 multiprocessing 昨天晚上组会轮到我汇报技术内容,最近正在和 ray 以及 spark 打交道,索性讲一下并发和并 ...