Måden at gøre dette på er med Oracles analytiske funktioner. Dit særlige scenarie er blot en variant af den løsning, jeg gav i en anden tråd.
Hvis du er interesseret i blot at vælge den næsthøjeste løn, så vil enhver af DENSE_RANK(), RANK() og ROW_NUMBER() gøre tricket:
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>
Men hvis du ønsker at vælge yderligere oplysninger, såsom navnet på den medarbejder med næsthøjeste løn, vil den funktion du vælger, påvirke resultatet. Hovedårsagen til at vælge en frem for en anden er, hvad der sker, når der er uafgjort.
Hvis du bruger ROW_NUMBER(), vil den returnere den anden medarbejder sorteret efter løn:hvad hvis der er to medarbejdere, der binder den højeste løn? Hvad hvis der er to medarbejdere, der binder den næsthøjeste løn? Mens hvis du bruger RANK() og der er to medarbejdere, der binder til den første højeste løn, vil der være ingen poster med RANK =2.
Jeg foreslår, at DENSE_RANK() er den normalt sikreste funktion at vælge i disse tilfælde, men det afhænger virkelig af det specifikke forretningskrav.