IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Erreur ORA-00979 : not a GROUP BY expression sur Oracle9i


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Erreur ORA-00979 : not a GROUP BY expression sur Oracle9i
    Bonjour.

    Voici la requête qui me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SELECT 
    	tab1.CONTENT_ID
    FROM
    	CONTENT tab1,
    	CONTENT_FILE tab2
    WHERE	
    	tab1.CONTENT_ID = 1000000000
    	AND tab1.CONTENT_ID = tab2.CONTENT_ID
    	AND (
    		SELECT
    			count(distinct tab3.CAPABILITY_ID)
    		FROM
    			CAPABILITY_CONTENT_FILE tab3
    		WHERE
    			tab3.CONTENT_FILE_ID = tab2.CONTENT_FILE_ID
    		)
    		=
    		(
    		SELECT
    			count(distinct tab4.CAPABILITY_ID)
    		FROM
    			CAPABILITY_CONTENT_FILE tab4
    		WHERE
    			tab4.CONTENT_FILE_ID = tab2.CONTENT_FILE_ID
    			AND tab4.CAPABILITY_ID IN ( 
    				SELECT 
    					CAPABILITY_ID
    				FROM 
    					CAPABILITY tab5
    				WHERE 
    					tab5.CODE IN ( 'cap' )
    			)
    		)
    ;
    En l'exécutant, on obtient une erreur ORA-00979 : not a group by expression.

    Pourtant, si on enlève l'une des premières clauses du where de plus haut niveau, alors l'exécution se passe sans problème.

    Je suis un peu à court d'idées pour réussi à faire marcher cette requête donc toute aide est la bienvenue :-)

    Merci.


    Mickaël

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il manque la clause GROUP BY cf la doc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Pourquoi faut-il un GROUP BY ?
    D'après la doc, le GROUP BY est utile quand il y a une fonction d'aggregation qui est utilisée mais ici, ce n'est pas le cas (les count() sont globaux aux résultats des requêtes).

    Et en plus, je le répète, enlever une des deux clauses "triviales" du WHERE rend la requête ok.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par Dirty Henry
    Pourquoi faut-il un GROUP BY ?
    D'après la doc, le GROUP BY est utile quand il y a une fonction d'aggregation qui est utilisée mais ici, ce n'est pas le cas (les count() sont globaux aux résultats des requêtes).

    Et en plus, je le répète, enlever une des deux clauses "triviales" du WHERE rend la requête ok.
    c'est quoi le clauses 'triviales'?
    [code]
    WHERE
    tab1.CONTENT_ID = 1000000000
    AND tab1.CONTENT_ID = tab2.CONTENT_ID
    [code]

    Si c'est cela, ce n'estr pas trivial car la deuxième condition crée un jointure. Et c'est la que tu dois avoir un conflit avec ton group by

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Essaye ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT
       tab1.CONTENT_ID,count(distinct tab3.CAPABILITY_ID), 
    FROM
       CONTENT tab1,
       CONTENT_FILE tab2,
       (SELECT count(distinct CAPABILITY_ID) nb_t3, CONTENT_FILE_ID FROM CAPABILITY_CONTENT_FILE GROUP BY CONTENT_FILE_ID) tab3,
       (SELECT count(distinct CAPABILITY_ID) nb_t4, CONTENT_FILE_ID FROM CAPABILITY_CONTENT_FILE GROUP BY CONTENT_FILE_ID) tab4,
       CAPABILITY_CONTENT_FILE tab4,
       CAPABILITY tab5
    WHERE   
       tab1.CONTENT_ID = 1000000000
       AND tab1.CONTENT_ID = tab2.CONTENT_ID
       AND tab3.CONTENT_FILE_ID = tab2.CONTENT_FILE_ID
       AND tab4.CONTENT_FILE_ID = tab2.CONTENT_FILE_ID
       AND tab3.nb_t3 = tab4.nb_t4
       AND tab5.CAPABILITY_ID = tab4.CAPABILITY_ID
       AND tab5.CODE IN ( 'cap' )
    Aux erreurs près que j'aurais pu commettre, Oracle doit transformer ta requête comme ça. Est-ce que là tu comprends mieux pourquoi ça ne fonctionne pas sans GROUP BY ? Et est-ce que la requête n'est pas plus simple ainsi

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Pour la jointure, je suis d'accord mais enlever la clause "tab1.CONTENT_ID = 100000" rend aussi la requête valide.

    Et selon vous, le GROUP BY doit se référer au SELECT global ou au deux SELECT internes ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Fred_D
    Aux erreurs près que j'aurais pu commettre, Oracle doit transformer ta requête comme ça. Est-ce que là tu comprends mieux pourquoi ça ne fonctionne pas sans GROUP BY ? Et est-ce que la requête n'est pas plus simple ainsi
    Fonctionellement, ce n'est pas tout à fait ça et l'enjeu de la requête précédente est qu'elle est générée dynamiquement avec du code factorisé. Je suis d'accord qu'elle est assez moche au final mais bon, la vie fait pas de cadeaux...

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ajoute juste un GROUP BY CONTENT_FILE_ID dans les sous requêtes alors

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Fred_D
    Ajoute juste un GROUP BY CONTENT_FILE_ID dans les sous requêtes
    Effectivement, ça a l'air de marcher.

    J'arrive aussi à un truc qui semble marcher en rajoutant un GROUP BY tab1.CONTENT_ID dans la requête globale...

    Bon, on va dire que c'est résolu jusqu'à preuve du contraire.

    Merci pour votre aide.

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    même si ma requête n'était pas tout à fait juste, j'espère qu'elle ta permis de comprendre pourquoi ce group by est nécessaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-00979: not a GROUP BY expression
    Par Oratorio dans le forum Oracle
    Réponses: 6
    Dernier message: 16/11/2012, 09h21
  2. ORA-00979:not a GROUP BY expression
    Par kodo dans le forum SQL
    Réponses: 2
    Dernier message: 16/12/2010, 18h11
  3. ORA-00979: N'est pas une expression GROUP BY
    Par chakibtag dans le forum SQL
    Réponses: 2
    Dernier message: 09/07/2008, 10h22
  4. ORA-00979: N'est pas une expression GROUP BY
    Par NiGHtyWolf dans le forum Oracle
    Réponses: 3
    Dernier message: 10/05/2007, 19h11
  5. ORA-00979: not a GROUP BY expression
    Par Wurlitzer dans le forum Oracle
    Réponses: 13
    Dernier message: 01/02/2007, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo