oracle 查询各科前3名_ORACLE SQL查询获取前3名薪水rownum大于

I want to write a query to display employees getting top 3 salaries

SELECT *

FROM (SELECT salary, first_name

FROM employees

ORDER BY salary desc)

WHERE rownum <= 3;

But I dont understand how this rownum is calculated for the nested query

will this work or if it has problem ,request you to please make me understand:

SELECT *

FROM (SELECT salary, first_name

FROM employees

ORDER BY salary )

WHERE rownum >= 3;

解决方案

a_horse_with_no_name's answer is a good one,

but just to make you understand why you're 1st query works and your 2nd doesn't:

When you use the subquery, Oracle doesn't magically use the rownum of the subquery, it just gets the data ordered so it gives the rownum accordingly, the first row that matches criteria still gets rownum 1 and so on. This is why your 2nd query still returns no rows.

If you want to limit the starting row, you need to keep the subquery's rownum, ie:

SELECT *

FROM (SELECT * , rownum rn

FROM (SELECT salary, first_name

FROM employees

ORDER BY salary ) )sq

WHERE sq.rn >= 3;

But as a_horse_with_no_name said there are better options ...

EDIT: To make things clearer, look at this query:

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

note the difference between the sub rownum and the main rownum, see which one is used for criteria

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值