Oracle查询使用Window子句报ORA-00907缺失右括号错误
报错原因
这个ORA-00907和括号缺失没有任何关系,本质是版本语法兼容问题:
独立命名窗口的WINDOW子句是Oracle 21c才正式上线支持的语法,在21c之前的所有Oracle版本(包括生产环境广泛使用的11g、12cR2、19c等长期支持版本)中,解析器无法识别FROM子句后跟随的window w as (...)结构,解析流程中断后就会抛出"缺失右括号"的误导性错误,这也和你观察到的"移除Window子句后查询可正常执行"的现象完全吻合。
修改方法
根据你实际使用的Oracle版本选择对应方案即可:
21c之前的版本(绝大多数生产场景)
不支持独立WINDOW子句,直接把窗口定义内联到每个分析函数的OVER()块中即可,修正后的SQL如下:select P.*, first_value(product_name) over ( partition by product_category order by price desc range between unbounded preceding and unbounded following ) MAX_PRICE, last_value(product_name) over ( partition by product_category order by price desc range between unbounded preceding and unbounded following ) MIN_PRICE from product P;踩坑提醒:Oracle中如果分析函数指定了
order by但未显式声明窗口范围,默认窗口规则为range between unbounded preceding and current row。如果省略全分区范围的声明,last_value()只会返回当前行的商品名,无法拿到分类下最低价对应的商品,必须显式写全range between unbounded preceding and unbounded following的范围定义。21c及以上版本
你原本的写法本身符合语法规范,如果仍报相同错误,检查数据库的兼容级别参数是否配置为21.0及以上即可,不需要修改SQL结构。
内容的提问来源于stack exchange,提问作者Narms
相关产品推荐
相关产品推荐

