Oracle中使用ROWNUM获取TOP 1数据时遇ORA-00933错误求助
问题排查与解决
错误原因1:SQL语法顺序违规
你的语句把ORDER BY放在了WHERE前面,这违反了Oracle SQL的语法规则——WHERE子句必须位于ORDER BY之前,这直接触发了ORA-00933错误。
错误原因2:ROWNUM使用逻辑错误
就算调整顺序为WHERE ROWNUM = 1 ORDER BY HIREDATE,也得不到正确结果。因为Oracle的ROWNUM是在排序操作之前就为返回行分配编号的,先筛选ROWNUM=1再排序,得到的只是随机一行,并非最早入职的员工。
正确写法
方法1:子查询先排序再取ROWNUM(兼容所有Oracle版本)
SELECT NAME, HIREDATE FROM ( SELECT CONCAT(FIRSTNAME, LASTNAME) AS NAME, HIREDATE FROM EMPLOYEE ORDER BY HIREDATE ASC ) WHERE ROWNUM = 1;
方法2:使用FETCH FIRST(Oracle 12c及以上版本支持)
这种写法更简洁直观:
SELECT CONCAT(FIRSTNAME, LASTNAME) AS NAME, HIREDATE FROM EMPLOYEE ORDER BY HIREDATE ASC FETCH FIRST 1 ROW ONLY;
补充说明
如果存在多个员工入职日期相同且均为最早的情况,上述两种写法仅会返回其中一行。若要返回所有最早入职的员工,可使用RANK()窗口函数:
SELECT NAME, HIREDATE FROM ( SELECT CONCAT(FIRSTNAME, LASTNAME) AS NAME, HIREDATE, RANK() OVER(ORDER BY HIREDATE ASC) AS hire_rank FROM EMPLOYEE ) WHERE hire_rank = 1;
内容的提问来源于stack exchange,提问作者Ani_stuck
相关产品推荐
相关产品推荐

