Oracle使用Union、Order By和Rownum出现ORA-00904错误如何解决?
报错原因
UNION 拼接的两个内层子查询仅返回了amt字段,未将排序依赖的CreationDate字段包含在返回结果集中,因此外层执行ORDER BY CreationDate DESC时,数据库无法识别该字段,触发ORA-00904标识符无效错误。
解决方法
调整内层查询逻辑,将CreationDate加入UNION两侧子查询的返回字段中,保证排序字段可被正常识别即可。
修正后的SQL示例如下:
SELECT amt FROM (SELECT amt, CreationDate FROM MyTable1 UNION SELECT amt, CreationDate FROM MyTable2 ORDER BY CreationDate DESC) WHERE rownum = 1;
你使用的是Oracle 12c及以上版本,也可以用更简洁的FETCH语法实现取第一条的需求:
SELECT amt FROM ( SELECT amt, CreationDate FROM MyTable1 UNION SELECT amt, CreationDate FROM MyTable2 ) ORDER BY CreationDate DESC FETCH FIRST 1 ROW ONLY;
注意事项
- UNION要求两侧查询的字段数量、数据类型完全匹配,因此必须给两个子查询都加上
CreationDate返回字段,不能仅给单侧添加 - 如果合并两个表的结果时不需要去重,可以将
UNION替换为UNION ALL,能大幅提升查询性能
内容的提问来源于stack exchange,提问作者user2488578
相关产品推荐
相关产品推荐

