要做到这一点的方法是使用Oracle的分析函数。您的特定场景只是我在another thread中提供的解决方案的一个变体。
如果你有兴趣只是选择第二最高的薪水那么任何DENSE_RANK(),RANK()和ROW_NUMBER(的)会做的伎俩:
SQL> select * from
2 (select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 (select distinct sal
6 from emp)
7 )
8 where rnk = 2
9/
SAL RNK
---------- ----------
3000 2
SQL>
但是,如果你想选择其他信息,例如薪水第二高的员工姓名,则您选择的功能会影响结果。选择一个在另一个之上的主要原因是当发生平局时发生的情况。
如果您使用ROW_NUMBER()函数,它将返回按工资排序的第二名员工:如果有两名员工为最高工资绑定,该怎么办?如果有两名员工争取第二高的薪水呢? Wheareas如果使用RANK(),并有两名员工为搭售第一薪水最高,将会有没有记录与RANK = 2
我建议DENSE_RANK()是通常在这种情况下,选择最安全功能,但它确实取决于具体的业务需求。
来源
2010-03-22 10:45:15
APC
-1我不确定这会返回什么,但可能不是什么问题是关于:-) – 2010-03-22 09:53:17
这取决于他的意思是“方法”。 对我来说,一个方法是一个获得结果的过程;这是我建议的方法。感谢我的第一次downvote :)。 – systempuntoout 2010-03-22 09:57:08
@Aaron:或许不是最有效的方法来返回结果(因为它使用自联接),但它会返回正确的答案,*提供的薪水是唯一的*(如果有三个人,它将不起作用与最高工资相同)。 – 2010-03-22 10:10:08