Fonction de groupe n'est pas autorisé ici
Lorsque j'exécute la requête suivante, je reçois
ORA-00934: fonction de groupe n'est pas autorisé ici
quel est le problème ?
select c.Numcom,c.Nompr,c.salaire_fix
from commercialv c,comercialv c1
where c.salaire_fix=(max(c1.salaire_fix) );
- D'abord je pense que vous avez raté une jointure, deuxièmement, vous devez obtenir le max comme une sous-requête
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser une fonction d'agrégation dans un
WHERE
clause.Donné votre cas, vous voudrez probablement une sous-requête:
Le rationnel est que les fonctions d'agrégation travaille sur un ensemble. Le
WHERE
clause d'autre part, a seulement accès aux données de une ligne.having
œuvres sur un groupe.where
est de filtrage de l'individu ("input") les lignes.Vous pouvez faire ce que vous voulez avec des fonctions analytiques:
Comme pour votre requête, des fonctions d'agrégation ne sont pas autorisés dans le
where
clause.c.salarie_fix = max(c.salaire_fix) over ()
ne fonctionne pasVous pouvez également faire cette requête à l'aide de
MAX()
comme une fonction de fenêtre (ou analytique de la fonction si vous préférez l'Oracle lingo):Vous pouvez également utiliser
RANK()
:Ou même
ROWNUM
:La seule difficulté avec le dernier c'est qu'il va obtenir une seule ligne, même si il y a d'autres lignes avec la valeur maximale de
salaire_fix
. Les deux premières requêtes obtiendrez plus d'une ligne dans ce cas.WHERE
clause. Le deuxième ne fonctionne pas parce que vous ne pouvez pas obtenirMAX(salaire_fix)
, lors du regroupement parsalaire_fix
. Vraiment, la meilleure façon d'obtenir le résultat que vous voulez est d'utiliser analytique (fenêtre) fonctionne comme dans ma réponse et @Gordon Linoff de l'. @Sylvain Leroux va également travailler et a l'avantage d'être totalement portable (par exemple, pour MySQL, qui n'a pas les fonctions de la fenêtre).