我有一张有薪水栏的员工表。
现在我可以找到最高工资。
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 :
为什么我错了?
答案 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