ORACLE 12C - SELECT 使用 ROWNUM 的查询

ORACLE 12C - SELECT query using ROWNUM

我必须使用 ROWNUM 从排序的 table 中获得第二个五 (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;

我得到一个空 table。为什么不起作用?

documentation 中所述,rownum 在获取行时进行评估。如果您从未获取第一行,则永远无法获取第二行。因此,没有获取任何行:

Conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows:

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;

I write in queston that using ROWNUM is necessary, because it's academic task.

在这种情况下使用子查询

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

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

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