我想写一个查询来显示员工获得前三名的薪水
SELECT *
FROM (SELECT salary, first_name
FROM employees
ORDER BY salary desc)
WHERE rownum <= 3;
Run Code Online (Sandbox Code Playgroud)
但我不明白这个rownum是如何计算嵌套查询这将工作或如果它有问题,请求你让我明白:
SELECT *
FROM (SELECT salary, first_name
FROM employees
ORDER BY salary )
WHERE rownum >= 3;
Run Code Online (Sandbox Code Playgroud)
我经历了这个链接Oracle/SQL:为什么查询"SELECT*FROM records WHERE rownum> = 5 AND rownum <= 10" - 返回零行,但它再次指向一个链接,但没有给出答案
a_horse_with_no_name的答案很好,
但只是为了让你理解为什么你的第一个查询有效,而你的第二个查询没有:
当您使用子查询时,Oracle不会神奇地使用子查询的rownum ,它只是获取订购的数据,因此它相应地给出了rownum,匹配条件的第一行仍然获得rownum 1,依此类推.这就是您的第二个查询仍然不返回任何行的原因.
如果要限制起始行,则需要保留子查询的rownum,即:
SELECT *
FROM (SELECT * , rownum rn
FROM (SELECT salary, first_name
FROM employees
ORDER BY salary ) )sq
WHERE sq.rn >= 3;
Run Code Online (Sandbox Code Playgroud)
但正如a_horse_with_no_name所说,有更好的选择......
编辑:为了使事情更清楚,请查看此查询:
with t as (
select 'a' aa, 4 sal from dual
union all
select 'b' aa, 1 sal from dual
union all
select 'c' aa, 5 sal from dual
union all
select 'd' aa, 3 sal from dual
union all
select 'e' aa, 2 sal from dual
order by aa
)
select sub.*, rownum main_rn
from (select t.*, rownum sub_rn from t order by sal) sub
where rownum < 4
Run Code Online (Sandbox Code Playgroud)
注意sub rownum和主rownum之间的区别,看看哪个用于标准