我必须使用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;
我得到一张空桌子。为什么它不起作用?
答案 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;