Oracle数据库Bug:相关子查询多层嵌套报错:标识符无效

Oracle Bug?

一、案例描述

  • 在Mysql中常常有如下写法
  • 用相关子查询 + order by desc + limit 1来完成需求
sql 复制代码
select code,
       date,
       (select value 
         from test t1 
        where t.code = t1.code 
          and t1.date between date_sub(t.date,interval 1 year) and t.date 
        order by t1.date desc 
        limit 1) as value
  from test t

因为oracle不支持limit,所以必须改写为row_number()或者rownum,如下所示

sql 复制代码
select code,
       date,
       (select value
          from (
		       select value,row_number()over(order by t1.date desc) as rn
		         from test t1 
		        where t.code = t1.code 
		          and t1.date between date_sub(t.date,interval 1 year) and t.date
		          ) 
		  where rn <= 1
         ) as value
  from test t

把这条Sql拿到Oracle去执行,是报错的,报date标识符无效,这明显不大合理,在我的印象中,oracle是支持这种写法的,而且一般Mysql支持的特性Oracle也支持,后面发现是oracle版本的问题

我把这条Sql语句拿到Oracle 19c执行是没有问题的,而报错的oracle版本是11.2.0.3.0

二、解决方案

<一>、升级版本

  • 19c是支持的,可以试下12c或其它版本

<二>、改写语句

  • keep函数:取同一个分组下以某个字段排序后,对指定字段取最小或最大的那个值

语法:

min | max (column1) keep (dense_rank first | last order by column2) over (partition by column3)

  • 最前是聚合函数,如min、max、sum、avg ...
  • column1是要计算的列
  • dense_rank first | last是keep的属性,表示按照分组、排序结果取第一个、最后一个

把上述代码改成keep语句,只用一层嵌套子查询

sql 复制代码
select code,
       date,
       (select max(value)keep(dense_rank first order by t1.date desc)
         from test t1 
        where t.code = t1.code 
          and t1.date between date_sub(t.date,interval 1 year) and t.date 
          ) as value
  from test t
相关推荐
我是一颗柠檬13 小时前
【Redis】发布订阅与消息队列Day8(2026年)
数据库·redis·后端·缓存
sukioe13 小时前
Redis 持久化+高可用详解:RDB/AOF/混合/主从/哨兵/集群
数据库·redis·缓存
全栈软件开发13 小时前
祈福导航系统V1.1更新 优化后端控制逻辑和前台UI
数据库·祈福导航系统
_qingche14 小时前
H2 数据库到 MySQL 数据迁移
java·数据库·spring boot·mysql·spring·重构·kotlin
AOwhisky14 小时前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算
数据库小学妹15 小时前
MySQL ORDER BY 深度解析:Using temporary 与 Using filesort 的底层机制及索引优化实战
数据库·经验分享·mysql·性能优化·dba
AI人工智能+电脑小能手15 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
WPF工业上位机15 小时前
YXGK.FakeVM数据库示例
jvm·数据库·oracle
牛奔16 小时前
如何让 GORM 打印 SQL 语句?三种方式全解析
数据库·sql
XWalnut16 小时前
Redis从入门到精通
数据库·redis·缓存