De manier om dit te doen is met de analytische functies van Oracle. Jouw specifieke scenario is slechts een variant op de oplossing die ik in een andere thread heb gegeven.
Als je alleen het op één na hoogste salaris wilt selecteren, dan is een van de DENSE_RANK(), RANK() en ROW_NUMBER() voldoende:
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>
Als u echter aanvullende informatie wilt selecteren, zoals de naam van de werknemer met het op één na hoogste salaris, heeft de functie die u kiest invloed op het resultaat. De belangrijkste reden om de een boven de ander te verkiezen, is wat er gebeurt als er een gelijkspel is.
Als u ROW_NUMBER() gebruikt, wordt de tweede werknemer geretourneerd die is gerangschikt op salaris:wat als er twee werknemers zijn die binden voor het hoogste salaris? Wat als er twee werknemers binden voor het op één na hoogste salaris? Maar als u RANK() gebruikt en er zijn twee werknemers die binden voor het eerste hoogste salaris, dan is er nee records met RANG =2.
Ik stel voor dat DENSE_RANK() in deze gevallen meestal de veiligste functie is om te kiezen, maar het hangt echt af van de specifieke zakelijke vereisten.