Pour ce faire, utilisez les fonctions analytiques d'Oracle. Votre scénario particulier n'est qu'une variante de la solution que j'ai fournie dans un autre fil.
Si vous souhaitez simplement sélectionner le deuxième salaire le plus élevé, n'importe lequel de DENSE_RANK(), RANK() et ROW_NUMBER() fera l'affaire :
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>
Cependant, si vous souhaitez sélectionner des informations supplémentaires, telles que le nom de l'employé avec le deuxième salaire le plus élevé, la fonction que vous choisissez affectera le résultat. La principale raison de choisir l'un plutôt qu'un autre est ce qui se passe lorsqu'il y a égalité.
Si vous utilisez ROW_NUMBER(), il renverra le deuxième employé classé par salaire :que se passe-t-il s'il y a deux employés à égalité pour le salaire le plus élevé ? Que se passe-t-il s'il y a deux employés à égalité pour le deuxième salaire le plus élevé ? Alors que si vous utilisez RANK() et qu'il y a deux employés à égalité pour le premier salaire le plus élevé, il n'y aura non enregistrements avec RANG =2.
Je suggère que DENSE_RANK() est généralement la fonction la plus sûre à choisir dans ces cas, mais cela dépend vraiment des besoins spécifiques de l'entreprise.