You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROWNUM函数使用疑问:如何正确获取TOP 10数据?

解决Oracle ROWNUM无法获取第10行的问题

为什么你的查询没返回数据?

Oracle的ROWNUM是在查询结果生成时逐行分配的序号,它的逻辑有点特殊:

  • 只有当某一行被确定会被返回时,才会给它分配ROWNUM=1
  • 只有存在ROWNUM=1的行,才会继续给下一行分配ROWNUM=2,以此类推
  • 当你直接写WHERE ROWNUM = 10时,数据库会先检查第一行——它的ROWNUM是1,不满足条件,所以不会返回;接着第二行ROWNUM是2,也不满足……直到所有行都被过滤掉,自然没有结果。

而ROWNUM = 1能查到,是因为第一行符合条件,会被正常返回。

正确的实现方式

你有两种常用的方法来获取排序后的第10行数据:

方法1:给ROWNUM起别名,在外层筛选

把ROWNUM赋值给一个别名,然后在外层查询中筛选这个别名等于10,注意要把排序逻辑放在最内层,确保ROWNUM是在排序后分配的:

SELECT * 
FROM (
    SELECT t.*, ROWNUM AS rn
    FROM (
        SELECT CON_NAME, HIGHEST_QUAL 
        FROM temp2 
        ORDER BY HIGHEST_QUAL DESC
    ) t
)
WHERE rn = 10;

方法2:使用ROW_NUMBER()窗口函数(Oracle 12c+推荐)

如果你的Oracle版本是12c及以上,更推荐用窗口函数ROW_NUMBER(),逻辑更直观清晰:

SELECT CON_NAME, HIGHEST_QUAL
FROM (
    SELECT 
        CON_NAME, 
        HIGHEST_QUAL,
        ROW_NUMBER() OVER (ORDER BY HIGHEST_QUAL DESC) AS rn
    FROM temp2
)
WHERE rn = 10;

这个函数会直接在排序后的结果集中为每一行分配序号,你只需要在外层筛选序号为10的行即可。

额外小提示

如果你的需求是获取TOP 10(前10行),而不是单独第10行,那么直接用WHERE ROWNUM <=10就可以了——这个写法是有效的,因为只要行的ROWNUM小于等于10,就会被依次返回。

内容的提问来源于stack exchange,提问作者user8960350

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:23