0
votes

Problème de moins et de sous-titres avec la commande

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)
      );

2 commentaires

Et qu'est-ce qui ne va pas avec ça?


Il lance ORA-00907, à cause de commander par 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 les supprime.


3 Réponses :


3
votes

Vous ne pouvez pas utiliser commander par code> là-bas.

Essayez cela à la place: P>

select salary from employees
order by salary desc
offset 4 rows fetch next 6 rows only;


0 commentaires

1
votes

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


2 commentaires

Malheureusement, rownum est évalué avant la commande par . Donc, cette requête ne va pas donner le 5ème à 10e salaires les plus élevés (sauf par chance).


@MatthewMcpeak est convenu.



2
votes

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 par code> dans la première branche de votre syndicat, mais en supprimant simplement cela ne vous aidera pas beaucoup.

Vous faites un erreur (assez courante) avec commande et rownum code>; Vous cherchez juste à la première sous-sous-requête que vous avez: p> xxx pré>

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> xxx pré>

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> xxx pré>

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> xxx pré>

qui donne un résultat beaucoup plus raisonnable - et cohérent - résultat. Vous pouvez alors moins les deux requêtes: 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


0 commentaires