当前位置: 首页 > news >正文

Oracle 中 ROWNUM 使用问题记录

ROWNUM 使用问题记录(2023-08-17)

  • Oracle 版本: 19.0.0.0.0 Enterprise
  • 现象:今天在项目遇到一个问题,测试人员反馈前一天能看到的数据今天看不到了

用表格举例,这是前一天看到的数据,有9、7、1 这几个数量信息

日期ID数量
XXX19
XXX27
XXX31

今天测试反馈 9 没了,但是库里是有的

ID数量
XXX27
XXX31
XXX41
  • 排查问题:我跟踪代码把SQL拿出来到数据库执行,确实没查出来数值 9 的数据
# SQL 如下(昨天能显示的时候ROWNUM 为<=20)
SELECT dt_date,id,num FROM T WHERE dt_date>=2301 and dt_date<=2307 AND ROWNUM <= 10ORDER BY num DESC
  • 比较奇怪的是 ROWNUM<= 20 的时候能查出来为9 的那一条数据(其实即使查出来 9 数据结果也不对,因为还有一条数值为 12 的)
    • 先是改回 ROWNUM <= 20 确实能看到数值为9 的那一条数据了,但是还有一个数值12的没有查出来,还是不对
    • 通过回忆MYSQL的写法结合查询结果现象推测Oracle SQL 执行顺序与MYSQL不一样
      • 在MYSQL中上述SQL执行结果是正常的会取出数值为9 、12 的数据,MySql 会先执行Order By 操作,然后执行 Limit 取值,并且 Limit 会在Where 条件后执行
      • 在Oracle中就不行了,这里使用到了ROWNUM,而 ROWNUM 是写在 Where 条件中的,SQL 执行过程与Mysql 就产生了差异,根据现象得知Oracle先得到结果,然后生成虚拟的ROWNUM,再然后执行WHERE条件,最后 Orader By 操作,这样就出现了与测试反馈的一样的结果,取值在前排序在后,所以取出来的值如果刚巧数据满足要求时就不容易看出来问题
  • 解决问题:通过包装一层SQL来处理这个问题,先排序,再取值
# 通过嵌套SQL查询解决
SELECT * FROM (SELECT dt_date,id,num FROM T WHERE dt_date>=2301 and dt_date<=2307ORDER BY num DESC
) A
WHERE ROWNUM<=10
  • 本次问题根因:
  1. 太久(十多年了)没有使用过Oracle 了特性啥的早忘光光了,不然应该不会犯这个错误
  2. SQL 是老师提供的,我也没想那么多,直接用了,估计老师也可能也没想到吧
http://www.lryc.cn/news/136359.html

相关文章:

  • MySQL数据库:内置函数
  • 【C++杂货铺】探索string的底层实现
  • c++ day1
  • 变动的Python爬虫实现
  • mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除
  • 数据API服务管理功能:解放数据潜力,提升业务效率
  • 云南森林火灾vr消防模拟安全演练系统训练消防员火灾和事故的适应和应对能力
  • (6)(6.2) 任务命令
  • 【consul】
  • Electron环境搭建
  • MinIO线上扩容实战
  • 【微服务】微服务的概论
  • 基于Jenkins自动打包并部署docker环境
  • jvm 运行时数据区
  • Jobs Portal求职招聘系统源码v3.5版本
  • Android kotlin系列讲解(入门篇)使用Intent在Activity之间穿梭
  • 音频编码类型及对应的封装文件
  • 初探科研 | 第一次科研经历
  • Wireshark数据抓包分析之HTTP协议
  • 研发管理工具大揭秘!6款利器助你高效研发
  • 云知识入门-什么是虚拟机、磁盘、镜像和快照
  • C/C++编译整理
  • 数据结构——栈和队列
  • 苍穹外卖阿里云oss存储笔记
  • Kafka 集群搭建过程
  • 【算法随记】在计算过程中模的情况
  • MSTP多生成树协议(第二课)
  • 数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
  • Linux存储学习笔记
  • ubuntu执行jmeter端口不够用报错(Address not available)