Способ сделать это с помощью аналитических функций Oracle. Ваш конкретный сценарий - просто вариант решения, которое я предоставил в другом потоке .
Если вы заинтересованы в выборе второй по величине зарплаты, тогда любой из 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 (), он вернет второго сотрудника, упорядоченного по зарплате: что, если два сотрудника связывают самую высокую зарплату? Что делать, если два сотрудника привязаны к второй по величине зарплате? Если вы используете RANK () и два сотрудника привязаны к первой самой высокой зарплате, будет нет записей с RANK = 2.
Я предлагаю DENSE_RANK (), как правило, самая безопасная функция для выбора в этих случаях, но она действительно зависит от конкретных бизнес-требований.