ORACLE 12C - 使用ROWNUM进行SELECT查询

时间:2017-06-24 13:44:37

标签: sql oracle oracle12c

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

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

3 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分:1)

  

我在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

答案 2 :(得分:0)

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

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