我想要第二高的薪水。
SELECT *
FROM c
WHERE salary IN (
SELECT salary
FROM c
ORDER BY salary DESC
GROUP BY rownum salary
HAVING rownum = 2
);错误:缺少表达式
发布于 2017-10-06 06:21:55
您可以在这里使用秩分析函数。
SELECT salary
FROM
(
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) dr
FROM c
) t
WHERE dr = 2;这将返回第二高的薪金按密集的等级,包括所有联系第二。
发布于 2017-10-06 09:02:54
解释为什么您的子查询不能工作:
rownum的时候。salary的所有记录都压缩到一个行。您以前拥有的单个行的rownum不再可用。HAVING过滤,这是无法工作的,因为您正在尝试访问rownum。而且,rownum = 2上的条件总是失败的,因为您正在删除第一行,所以它是“未读”,rownum 1仍然可用,您忽略了第二行,因为您甚至还没有读过rownum 1,等等。rownum的条件总是rownum <= some_number (除了1种条件外,您可以拥有rownum = 1)。ORDER BY子句属于查询的末尾。(之后只有甲骨文12c的FETCH FIRST n ROWS。)下面是如何使它与rownum一起工作的方法
select salary
from
(
select salary
from
(
select distinct salary
from c
order by salary desc
)
where rownum <= 2
order by salary
)
where rownum = 1;这是可行的,因为Oracle在这里违反了SQL标准。根据标准,来自子查询的数据被认为是无序的,但是Oracle在使用rownum时保证顺序。
下面是如何使用聚合来完成这一任务:
select max(salary) from c where salary < (select max(salary) from c);由于Oracle 10,您也可以使用解析函数,如Tim的答案所示。
https://stackoverflow.com/questions/46599443
复制相似问题