Sposobem na to jest użycie funkcji analitycznych Oracle. Twój konkretny scenariusz jest tylko wariantem rozwiązania, które przedstawiłem w innym wątku.
Jeśli chcesz po prostu wybrać drugą najwyższą pensję, wystarczy dowolny z DENSE_RANK(), RANK() i 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>
Jeśli jednak chcesz wybrać dodatkowe informacje, takie jak imię i nazwisko pracownika z drugą najwyższą pensją, wybrana przez Ciebie funkcja będzie miała wpływ na wynik. Głównym powodem wyboru jednego z nich jest to, co dzieje się, gdy jest remis.
Jeśli użyjesz ROW_NUMBER(), zwróci drugi pracownik uporządkowany według wynagrodzenia:co, jeśli dwóch pracowników wiąże się z najwyższą pensją? Co się stanie, jeśli dwóch pracowników będzie ubiegać się o drugą najwyższą pensję? Z drugiej strony, jeśli użyjesz RANK() i dwóch pracowników remisuje o pierwszą najwyższą pensję, nie będzie nie rekordy z RANKĄ =2.
Sugeruję, że DENSE_RANK() jest zwykle najbezpieczniejszą funkcją do wyboru w takich przypadkach, ale tak naprawdę zależy to od konkretnych wymagań biznesowych.