Oracle子查询使用ORDER BY执行报ORA-00907缺少右括号问题
报错原因
- 标量子查询中同时使用
rownum = 1和order by不符合Oracle旧版本语法规范,直接触发ORA-00907: missing right parenthesis报错。 - 即使语法兼容,现有写法的执行逻辑也不符合需求:Oracle会先执行
where条件筛选出第一条记录,再执行排序,最终返回的不是排序后的第一条结果。
修复方案
方案1:Oracle 12c及以上版本(推荐)
使用fetch first 1 row only语法替代rownum=1,会先执行排序再取第一条记录,语法更简洁:
select S.value, nvl( (select D.value from D join T on D.subID = t.SubID where D.subid2 = s.subid2 and t.subid3 = s.subid3 order by t.id fetch first 1 row only), 0) as value from S;
方案2:兼容所有Oracle版本写法
将排序逻辑放在内层子查询,外层再通过rownum=1取第一条,既兼容旧版本语法,也能保证取到排序后的第一条结果:
select S.value, nvl( (select tmp.value from ( select D.value from D join T on D.subID = t.SubID where D.subid2 = s.subid2 and t.subid3 = s.subid3 order by t.id ) tmp where rownum = 1), 0) as value from S;
内容的提问来源于stack exchange,提问作者Raed Alsaleh
相关产品推荐
相关产品推荐

