【问题标题】:ORACLE 12C - SELECT query using ROWNUMORACLE 12C - 使用 ROWNUM 选择查询
【发布时间】:2026-02-06 07:35:01
【问题描述】:

我必须使用 ROWNUM 从排序表中获得后五 (6-10) 个最佳工资记录。

使用 ROWNUM 是必要的。

当我执行查询时:

SELECT ROWNUM AS position, name, salary
    FROM (SELECT name, salary
            FROM employees
            ORDER BY salary DESC)
    WHERE ROWNUM <= 10;

我获得了前 10 个最佳记录。

现在当我尝试执行查询时:

    SELECT ROWNUM AS position, name, salary
        FROM (SELECT name, salary
                FROM employees
                ORDER BY salary DESC)
        WHERE ROWNUM >= 6 AND ROWNUM <= 10;

我得到一张空桌子。为什么它不起作用?

【问题讨论】:

    标签: sql oracle oracle12c


    【解决方案1】:

    documentation 中所述,rownum 在获取行时进行评估。如果您从不获取第一行,则永远不会到达第二行。因此,不会获取任何行:

    对大于正整数的ROWNUM 值进行条件测试 总是假的。例如,此查询不返回任何行:

    SELECT * FROM employees
        WHERE ROWNUM > 1;
    

    但是,更重要的是,您使用的是 Oracle 12C。因此,请使用 fetch first 而不是 rownum。这具有多个优点。除了是标准 SQL,您不需要子查询:

    SELECT name, salary
    FROM employees
    ORDER BY salary DESC
    FETCH FIRST 10 ROWS ONLY;
    

    第二个:

    SELECT name, salary
    FROM employees
    ORDER BY salary DESC
    OFFSET 5 ROWS
    FETCH FIRST 5 ROWS ONLY;
    

    【讨论】:

    • 我在 queston 中写道,使用 ROWNUM 是必要的,因为它是学术任务。
    【解决方案2】:

    我在 queston 中写道,使用 ROWNUM 是必要的,因为它是 学术任务。

    在这种情况下使用子查询

    SELECT name, salary
    FROM (
      SELECT name, salary, ROWNUM as my_rownum
      FROM employees
      ORDER BY salary DESC
    )
    WHERE my_rownum BETWEEN 6 AND 10
    

    【讨论】:

      【解决方案3】:

      您可以使用以下查询并尝试....

      SELECT name,salary from ( SELECT name,salary, DENSE_RANK() OVER (ORDER BY salary DESC) as rn from employees ) where rn between 6 and 10;

      【讨论】: