Oracle 甲骨文第三高薪

Oracle 甲骨文第三高薪,oracle,oracle-sqldeveloper,Oracle,Oracle Sqldeveloper,我一直在寻找从数据库(使用Oracle数据库)中查找第三高工资的查询。我找到了下面的查询- SELECT * FROM ( SELECT e.*, row_number() over (order by sal DESC) rn FROM emp e ) WHERE rn = 3; 我的系统中没有安装oracle,所以我不会尝试。但是我想知道下面的查询是否有效。若否,原因为何 WITH Sal_sort AS (SELECT DISTINCT sal FROM salary ORD

我一直在寻找从数据库(使用Oracle数据库)中查找第三高工资的查询。我找到了下面的查询-

SELECT *
FROM
  ( SELECT e.*, row_number() over (order by sal DESC) rn FROM emp e
  )
WHERE rn = 3;
我的系统中没有安装oracle,所以我不会尝试。但是我想知道下面的查询是否有效。若否,原因为何

WITH Sal_sort AS
  (SELECT DISTINCT sal FROM salary ORDER BY sal DESC
  )
SELECT * FROM Salary S, Sal_sort SS WHERE S.Sal = SS.Sal AND SS.rownum = 3;

输入数据

emp_no  emp_fname   emp_lname   salary
1   aa                      bb                      30  
2   ee                      yy                      31  
3   rr                      uu                      32  
4   tt                      ii                      33  
5   tt                      ii                      33  
6   tt                      ii                      33  
7   tt                      ii                      33  
8   tt                      ii                      30  
9   tt                      ii                      31  
示例:

select * from ee;
select emp_no,salary ,dense_rank() over (order by salary  ) dr
from ee
输出

emp_no  salary  dr
1        30     1
8        30     1
9        31     2
2        31     2
3        32     3
4        33     4
5        33     4
6        33     4
7        33     4
就一行

select * from (
select salary,dense_rank() over (order by salary desc) rank from  employees) where rank=3;


在数据库的第12版和更高版本中更容易

SELECT *
  FROM employees
 ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
Tim谈到了这个功能

如果你看一下这个计划,你会发现它并不神奇,优化器正在使用分析函数来推导结果

无密集等级()

具有密集等级()


下载Express edition进行测试。你甚至不必安装Oracle,你也可以在这里尝试这是“选择第n行”问题的一个变体,“我的系统中没有安装Oracle”,点击这里:排名第一的是Larry Ellison
SELECT *
  FROM employees
 ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
SELECT salary FROM employees
ORDER BY salary DESC
OFFSET 2
FETCH 1 NEXT ONE ROWS ONLY;
SELECT salary 
FROM
(
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) as rank from employees
)
WHERE rank = 3;