Der Weg, dies zu tun, ist mit den analytischen Funktionen von Oracle. Ihr spezielles Szenario ist nur eine Variante der Lösung, die ich in einem anderen Thread bereitgestellt habe.
Wenn Sie daran interessiert sind, nur das zweithöchste Gehalt auszuwählen, reicht eines von DENSE_RANK(), RANK() und ROW_NUMBER() aus:
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>
Wenn Sie jedoch zusätzliche Informationen auswählen möchten, wie z. B. den Namen des Mitarbeiters mit dem zweithöchsten Gehalt, wirkt sich die gewählte Funktion auf das Ergebnis aus. Der Hauptgrund für die Wahl eines über den anderen ist, was passiert, wenn es ein Unentschieden gibt.
Wenn Sie ROW_NUMBER() verwenden, wird der zweite Mitarbeiter nach Gehalt geordnet zurückgegeben:Was ist, wenn es zwei Mitarbeiter gibt, die das höchste Gehalt haben? Was ist, wenn zwei Mitarbeiter das zweithöchste Gehalt anstreben? Wenn Sie jedoch RANK() verwenden und es zwei Mitarbeiter gibt, die sich das erste höchste Gehalt streiten, gibt es nein Datensätze mit RANK =2.
Ich schlage vor, dass DENSE_RANK() in diesen Fällen normalerweise die sicherste Funktion ist, aber es hängt wirklich von den spezifischen Geschäftsanforderungen ab.