为什么查询找到第3个最高薪水不起作用?

时间:2014-03-13 04:48:23

标签: sql oracle

我有一张有薪水栏的员工表。

现在我可以找到最高工资。

select max(salary) from emp;

的第二高薪
select max(salary) from emp where salary not in (select max(salary)from emp);

现在我正试图用这两个来找到第三高薪...

select max(salary) from emp where salary not in 
(
select max(salary)from emp,
select max(salary) from emp where salary not in (select max(salary)from emp)
);

我在这里遇到错误。

ORA-00903: invalid table name :

为什么我错了?

7 个答案:

答案 0 :(得分:2)

试试这个,

WHERE(n)在这里传递你想要第二高或第三高的传球作为第二高的WHERE(2)和第三高的WHERE(3)。

SELECT *
FROM emp  Emp1
WHERE ( n ) = (
               SELECT COUNT( DISTINCT ( Emp2.salary ) )
               FROM emp  Emp2
               WHERE Emp2.salary >= Emp1.salary
            )

您也可以使用

Select TOP 1 salary as '3rd Highest Salary'
from (SELECT DISTINCT TOP 3 salary from emp ORDER BY salary DESC)
a ORDER BY salary ASC 

答案 1 :(得分:1)

尝试这种更简单的方法:

select *
From(
  SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) 
AS MaxSal,salary from emp
)x where MaxSal=2

请参阅SQL Fiddle中的示例。

现在你只需要用n替换2来找到第n个最高的最高工资。

答案 2 :(得分:1)

这就是我将使用dense_rank,这也可以给出相同的薪水,相同的“等级”。

选择   * 从  (选择     薪水,     dense_rank()over(由SALARY desc命令)为RANK   从     EMP) 哪里   RANK = 3

答案 3 :(得分:0)

尝试使用ROW_NUMBER分析功能。

SELECT * 
FROM( 
     SELECT s.*, row_number() OVER (ORDER BY sal DESC) rownumber
     FROM   emp s
     )
WHERE rownumber = 3;

答案 4 :(得分:0)

这应该有效

  Select * from 
  (       select e.*, row_number() 
          OVER ( ORDER BY salary DESC ) 
          MaxSal from emp e) 
  MaxSal=3

答案 5 :(得分:0)

您可以使用此

SELECT * FROM table_name ORDER BY salary DESC LIMIT 2,1

答案 6 :(得分:0)

它反对行开头的SELECT
SELECT MAX(salary) FROM emp WHERE salary NOT IN (SELECT MAX(salary)FROM emp)
IN列表可以包含值列表或返回值列表的查询,而不是列表查询。当它看到这个SELECT它正在解析前一个FROM子句时虽然你给它一个逗号分隔的表列表,因此表名错误。

以您可能编写的方式运行查询: WITH EMP AS ( SELECT 30000 SALARY FROM DUAL UNION ALL SELECT 30000 SALARY FROM DUAL UNION ALL SELECT 20000 SALARY FROM DUAL UNION ALL SELECT 10000 SALARY FROM DUAL ) SELECT MAX(salary) FROM emp WHERE salary NOT IN ( SELECT MAX(salary)FROM emp UNION ALL SELECT MAX(salary) FROM emp WHERE salary NOT IN (SELECT MAX(salary)FROM emp) );
然而@ Tom的回答给出了一个很好的标准解决方案,结果和你一样。我想提供以下替代方案(但使用@ Tom's): SELECT DISTINCT salary FROM emp ORDER BY salary DESC OFFSET 2 ROWS FETCH FIRST ROW ONLY