select salary from ( (select salary from employees where rownum<=10 order by salary desc) minus (select salary from employees where rownum<=4 order by salary desc) );
3 Réponses :
Vous ne pouvez pas utiliser Essayez cela à la place: P> commander par code> là-bas.
select salary from employees
order by salary desc
offset 4 rows fetch next 6 rows only;
Il n'a pas de sens de commander des lignes dans deux ensembles qui sont utilisés ultérieurement car les ensembles n'ont pas de commande. Si vous avez besoin d'une solution pouvant exécuter sur des versions plus anciennes et que vous souhaitez renvoyer les 6 bas classés parmi les 10 meilleurs classés, cela fonctionnera. Si vous pouvez utiliser des fonctionnalités plus récentes, vous voudrez peut-être le souhaiter car il est possible qu'ils nécessiteront moins d'exécutions d'instructions de machine.
Après avoir fait les changements évidents qui m'avaient échappé dans ma hâte ... P>
select salary from ( select rownum rn, salary from ( select salary from employees order by salary desc ) ) where rn between 5 and 10
Malheureusement, rownum code> est évalué avant i> la commande
par code>. Donc, cette requête ne va pas donner le 5ème à 10e salaires les plus élevés (sauf par chance).
@MatthewMcpeak est convenu.
Vous avez plusieurs problèmes dans ce que vous avez écrit. Le problème immédiat est que vous obtiendrez une erreur d'avoir une commande Vous faites un erreur (assez courante) avec commande et Le filtre code> rownum code> sera appliqué avant em> la commande par, Donc, ce que cela produira réellement est de 10 rangées indéterminées de la table, qui sont ensuite commandées. Si je cours, je reçois: p> Mais vous verrez des valeurs différentes, même du même schéma d'échantillons. Si vous regardez la table entière, vous verrez des valeurs plus élevées que celles; et même en cours d'exécution de la deuxième requête montrera que quelque chose n'est pas comme vous vous attendez - pour moi qui obtient: p> qui sont pas em> les quatre premières rangées de la requête précédente. (Encore une fois, vous verrez des résultats différents, mais j'espère que le même effet; sinon, regardez la table entière ordonnée par salaire.) P> Vous devez commander toute la table - dans une sous-requête - et ensuite Filtre: p> qui donne un résultat beaucoup plus raisonnable - et cohérent - résultat. Vous pouvez alors moins les deux requêtes: P> par code> dans la première branche de votre syndicat, mais en supprimant simplement cela ne vous aidera pas beaucoup.
rownum code>; Vous cherchez juste à la première sous-sous-requête que vous avez: p>
select salary
from (
select salary
from employees
order by salary desc
)
where rownum<=10
minus
select salary
from (
select salary
from employees
order by salary desc
)
where rownum<=4
order by salary desc;
SALARY
----------
13500
13000
12000
11500
Et qu'est-ce qui ne va pas avec ça?
Il lance ORA-00907, à cause de
commander par code> dans les sous-requêtes. Le plus simple Solution est Row_Number (), mais ce n'est pas clair si OP veut faire avec des valeurs distinctes et
moins code> les supprime.