Oracle按cnt降序取TOP3记录时rownum查询结果不符如何解决
问题根因
Oracle中rownum伪列的赋值优先级高于ORDER BY排序,原SQL会先按物理存储顺序取前3条记录,再对这3条做cnt降序排列,并非先完成全量排序再截取Top3,因此会漏掉cnt=2的QT16记录,结果不符合预期。
正确实现方案
全Oracle版本通用写法
通过子查询先完成全量数据的排序,再在外层查询用rownum限制返回行数,兼容所有Oracle版本:
SELECT * FROM ( SELECT * FROM 你的目标表名 ORDER BY cnt DESC ) WHERE rownum <= 3;
执行上述语句即可得到预期结果:
a b c cnt 99 YC 市購件異常 3 99 LY 漏油 2 99 QT16 其他異常 2
如果需要保证cnt值相同的记录返回顺序固定,可以在子查询的ORDER BY后追加二级排序字段,例如ORDER BY cnt DESC, b ASC即可在cnt相同时按b字段升序排列。
Oracle 12c及以上版本简化写法
从Oracle 12c开始原生支持FETCH FIRST分页语法,不需要嵌套子查询,写法更简洁:
SELECT * FROM 你的目标表名 ORDER BY cnt DESC FETCH FIRST 3 ROWS ONLY;
内容的提问来源于stack exchange,提问作者hsiaoyi
相关产品推荐
相关产品推荐

