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

SQL Oracle Discussion :

ORA-00979: N'est pas une expression GROUP BY


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut ORA-00979: N'est pas une expression GROUP BY
    Bonjour,

    Je ne vois dans la requête suivante ce qui ne va pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        SELECT T1.COL1, SUM(T1.COL3), (SUM(T1.COL3) + (SELECT SUM(T2.COL2) FROM TABLE2 T2 WHERE T2.COL1 = T1.COL1 AND T2.COL2 = T1.COL2)) AS ALIAS1
         FROM TABLE1 T1
        WHERE T1.COL1 = VALEUR1
          AND T1.COL2 = VALEUR2
     GROUP BY T1.COL1
    Lorsque je l'exécute, j'ai l'erreur suivante:

    ORA-00979: N'est pas une expression GROUP BY
    00979. 00000 - "not a GROUP BY expression"
    *Cause:
    *Action:
    Erreur à la ligne 1, colonne 136
    Merci,

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu ne groupes pas sur t1.col2.

    essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT T1.COL1,
             SUM (T1.COL3),
             (  SUM (T1.COL3)
              + (SELECT SUM (T2.COL2)
                   FROM TABLE2 T2
                  WHERE T2.COL1 = T1.COL1 AND T2.COL2 = T1.COL2))
                AS ALIAS1
        FROM TABLE1 T1
       WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1, T1.COL2;

  3. #3
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    Bonjour,

    Je ne vois dans la requête suivante ce qui ne va pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        SELECT T1.COL1, SUM(T1.COL3), (SUM(T1.COL3) + (SELECT SUM(T2.COL2) FROM TABLE2 T2 WHERE T2.COL1 = T1.COL1 AND T2.COL2 = T1.COL2)) AS ALIAS1
         FROM TABLE1 T1
        WHERE T1.COL1 = VALEUR1
          AND T1.COL2 = VALEUR2
     GROUP BY T1.COL1
    Lorsque je l'exécute, j'ai l'erreur suivante:

    Merci,

    Le group by statement doit être utilisé sur un champ spécifique et sur des fonctions de ce champ uniquement. Sinon tu as l'erreur 979 sous ORACLE.
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select col1, col1*2, sum(col1) from tab1 group by col1;
    sinon sur plusieurs champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select col1, col1*col2,col2, sum(col1) from tab1 group by col1,col2;
    reprends la doc, c'est bien expliqué.

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    autrement, si tu ne veux pas grouper sur col2, alors tu supprimes la jointure sur col2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT T1.COL1,
             SUM (T1.COL3),
             (  SUM (T1.COL3)
              + (SELECT SUM (T2.COL2)
                   FROM TABLE2 T2
                  WHERE T2.COL1 = T1.COL1 ))
                AS ALIAS1
        FROM TABLE1 T1
       WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1;

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par sweetasnz Voir le message
    reprends la doc, c'est bien expliqué.
    ok, alors explique-moi ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with table1 as (select 1 col1, 2 col2, 3 col3 , 1 valeur1, 2 valeur2 from dual),
      table2 as (select * from table1)
    SELECT T1.COL1, SUM(T1.COL3), (SUM (T1.COL3)
      + (SELECT SUM(T2.COL2) FROM TABLE2 T2 WHERE T2.COL1 = T1.COL1 and t2.col2=t1.col2)) AS ALIAS1
    FROM TABLE1 T1
    WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          COL1 SUM(T1.COL3)     ALIAS1
    ---------- ------------ ----------
             1            3          5
    PS: sans doute un bogue d'optimisation

    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
    /* Formatted on 20.03.2012 09:57:29 (QP5 v5.203.12040.36147) */
    SET ECHO ON autot on;
     
    WITH table1
         AS (SELECT 1 col1,
                    2 col2,
                    3 col3,
                    1 valeur1,
                    2 valeur2
               FROM DUAL 
    union all select 1,3,3,4,5 from dual where 1=0
               ),
         table2 AS (SELECT * FROM table1)
      SELECT T1.COL1,
             SUM (T1.COL3),
             (  SUM (T1.COL3)
              + (SELECT SUM (T2.COL2)
                   FROM TABLE2 T2
                  WHERE T2.COL1 = T1.COL1 and t2.col2=t1.col2))
                AS ALIAS1
        FROM TABLE1 T1
       WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error at line 16
    ORA-00979: not a GROUP BY expression

  6. #6
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Comme j'ai besoin de faire une jointure sur t1.col2, j'ai du ajouter t1.col2 dans mon select et dans le group by et ça marche (pas besoin de l'ajouter dans le select ça suffit dans le group by comme vous le dites)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       SELECT T1.COL1, T1.COL2, SUM(T1.COL3), (SUM(T1.COL3) + (SELECT SUM(T2.COL2) FROM TABLE2 T2 WHERE T2.COL1 = T1.COL1 AND T2.COL2 = T1.COL2)) AS ALIAS1
         FROM TABLE1 T1
        WHERE T1.COL1 = VALEUR1
          AND T1.COL2 = VALEUR2
     GROUP BY T1.COL1, T1.COL2

    Merci beaucoup pour votre aide!

  7. #7
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Je voudrais savoir si le modèle de code suivant vous semble correcte et où devrais-je mettre le compteur pour connaître le nombre de lignes traitées?

    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
    36
    37
    38
    39
    40
     
       CURSOR CUR1
       IS
        SELECT T1.COL1, T1.COL2, T1.COL3
          FROM TABLE1 T1, TABLE2 T2
         WHERE T1.COL1 = T2.COL1
           AND T2.COL2 = 'VALEUR1';
     
       CURSOR CUR2(P_COL1 TABLE1.COL1%TYPE, P_COL2 TABLE1.COL2%TYPE)
       IS
        SELECT T3.COL1, SUM(T3.COL3) AS ALIAS1
          FROM TABLE3 T3
         WHERE T3.COL1 = P_COL1
           AND T3.COL2 = P_COL2
      GROUP BY T3.COL1;
     
      COMPTEUR NUMBER := 0;
     
    BEGIN
      COMPTEUR := COMPTEUR + 1;
     
      FOR REC1 IN CUR1
      LOOP
        BEGIN
          FOR REC2 IN CUR2(REC1.COL1, REC1.COL2)
          LOOP
            BEGIN
              IF REC2.ALIAS1 <> REC1.COL3 THEN
                  --DBMS....
              END IF;
            EXCEPTION
              WHEN OTHERS THEN
              RAISE ;
            END;
          END LOOP;
        EXCEPTION
          WHEN OTHERS THEN
            RAISE ;
        END;
      END LOOP;
    Merci,

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Imbriquer des curseurs quand on peut faire une seule requête, il n'y a pas grand'chose de pire niveau performance.

  9. #9
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Si je n'avais pas des difficultés, je n'aurai pas demandé de l'aide!

    Merci,

  10. #10
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    PS: sans doute un bogue d'optimisation
    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
    WITH table1
         AS (SELECT 1 col1,
                    2 col2,
                    3 col3,
                    1 valeur1,
                    2 valeur2
               FROM DUAL 
    union ALL SELECT 1,3,3,4,5 FROM dual WHERE 1=0
               ),
         table2 AS (SELECT * FROM table1)
      SELECT T1.COL1,
             SUM (T1.COL3),
             (  SUM (T1.COL3)
              + (SELECT SUM (T2.COL2)
                   FROM TABLE2 T2
                  WHERE T2.COL1 = T1.COL1 AND T2.COL2=T1.COL2))
                AS ALIAS1
        FROM TABLE1 T1
       WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1,T1.COL2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          COL1 SUM(T1.COL3)     ALIAS1
    ---------- ------------ ----------
             1            3          5

    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
    WITH table1
         AS (SELECT 1 col1,
                    2 col2,
                    3 col3,
                    1 valeur1,
                    2 valeur2
               FROM DUAL 
    union ALL SELECT 1,3,3,4,5 FROM dual WHERE 1=0
               ),
         table2 AS (SELECT * FROM table1)
      SELECT T1.COL1,
             SUM (T1.COL3),
             (  SUM (T1.COL3)
              + (SELECT SUM (T2.COL2)
                   FROM TABLE2 T2
                  WHERE T2.COL1 = T1.COL1))
                AS ALIAS1
        FROM TABLE1 T1
       WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          COL1 SUM(T1.COL3)     ALIAS1
    ---------- ------------ ----------
             1            3          5

    en effet c'est pas si bien expliqué que ça ...
    group by :
    à priori les champs dans les clauses "where" jouent également un rôle ...
    bref, c'est bizarre, car on a pas besoin de spécifier T1.COL3 alors que T1.COL2 est nécessaire.
    je ne l'explique pas.

    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
    WITH table1
         AS (SELECT 1 col1,
                    2 col2,
                    3 col3,
                    1 valeur1,
                    2 valeur2
               FROM DUAL 
    union ALL SELECT 1,3,3,4,5 FROM dual WHERE 1=0
               ),
         table2 AS (SELECT * FROM table1)
      SELECT T1.COL1,
             SUM (T1.COL3),
             (  SUM (T1.COL3)
              + (SELECT SUM (T2.COL2)
                   FROM TABLE2 T2
                  WHERE T2.COL1 = T1.COL1 AND T2.COL2=T1.COL2))
                AS ALIAS1
        FROM TABLE1 T1
       WHERE T1.COL1 = VALEUR1 AND T1.COL2 = VALEUR2
    GROUP BY T1.COL1,T1.COL3,T1.COL2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          COL1 SUM(T1.COL3)     ALIAS1
    ---------- ------------ ----------
             1            3          5

  11. #11
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci pour votre aide mais je ne comprends pas ce que je dois faire.

  12. #12
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Intéressant!!!

    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
     
    mhouri.world> desc t1
     Name              Null?    Type
     ----------------------------------------- 
     ID                         NUMBER
     N1                         NUMBER
     VC2                        VARCHAR2(10)
     VC3                        VARCHAR2(100)
     
    mhouri.world> select
      2       t1.id
      3      ,sum(t1.n1)
      4      ,(sum(t1.n1) +
      5             (select
      6                   sum(t2.x1) x
      7              from  t2
      8              where t2.id  = t1.id
      9              and   t2.x1  = t1.n1
     10              )
     11        ) as alias1
     12  from   t1
     13   where t1.id   = 11
     14   and   t1.n1   = 707
     15   group by
     16         t1.id
     17        ;
                and   t2.x1  = t1.n1
                               *
    ERROR at line 9:
    ORA-00979: not a GROUP BY expression
    Ok, il veut que je groupe par t1.n1 et bien je vais le faire

    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
     
    mhouri.world> select
      2       t1.id
      3      ,sum(t1.n1)
      4      ,(sum(t1.n1) +
      5             (select
      6                   sum(t2.x1) x
      7              from  t2
      8              where t2.id  = t1.id
      9              and   t2.x1  = t1.n1
     10              )
     11        ) as alias1
     12  from   t1
     13   where t1.id   = 11
     14   and   t1.n1   = 707
     15   group by
     16         t1.id
     17        ,t1.n1
     18        ;
     
            ID SUM(T1.N1)     ALIAS1                                                
    ---------- ---------- ----------                                                
            11        707
    Je change légèrement ma requête en ajoutant une clause supplémentaire sur une autre colonne provenant de t1

    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
     
    mhouri.world> select
      2       t1.id
      3      ,sum(t1.n1)
      4      ,(sum(t1.n1) +
      5             (select
      6                   sum(t2.x1) x
      7              from  t2
      8              where t2.id  = t1.id
      9              and   t2.x1  = t1.n1
     10              and   t2.vc2 = t1.vc2
     11              )
     12        ) as alias1
     13  from   t1
     14   where t1.id   = 11
     15   and   t1.n1   = 707
     16   group by
     17         t1.id
     18        ,t1.n1
     19        ;
                and   t2.vc2 = t1.vc2
                               *
    ERROR at line 10:
    ORA-00979: not a GROUP BY expression
    Ok, il veut que je groupe maitenant par t1.vc2 et bien je vais le faire aussi

    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
     
    mhouri.world> select
      2       t1.id
      3      ,sum(t1.n1)
      4      ,(sum(t1.n1) +
      5             (select
      6                   sum(t2.x1) x
      7              from  t2
      8              where t2.id  = t1.id
      9              and   t2.x1  = t1.n1
     10              and   t2.vc2 = t1.vc2
     11              )
     12        ) as alias1
     13  from   t1
     14   where t1.id   = 11
     15   and   t1.n1   = 707
     16   group by
     17         t1.id
     18        ,t1.n1
     19        ,t1.vc2
     20        ;
     
            ID SUM(T1.N1)     ALIAS1                                                
    ---------- ---------- ----------                                                
            11        707
    Et ainsi de suite. A chaque fois qu'une colonne de la table t1(autre que t1.id) est invoquée dans le select imbriqué, je dois grouper par cette colonne

    Une explication?

    Peut-être en observant le plan d'exécution

    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
     
    mhouri.world> select * from table(dbms_xplan.display_cursor);
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------
     
    SQL_ID  5mzq0bmusjvtg, child number 0
    -------------------------------------
    select      t1.id     ,sum(t1.n1)     ,(sum(t1.n1) +            (select
               sum(t2.x1) x             from  t2             where t2.id  = t1.id
                and   t2.x1  = t1.n1             )       ) as alias1 from   t1
    where t1.id   = 11  and   t1.n1   = 707  group by        t1.id       ,t1.n1
     
    Plan hash value: 508850092
     
    --------------------------------------------------------------------------------------
    | Id  | Operation                    | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |       |       |       |     3 (100)|          |
    |   1 |  SORT AGGREGATE              |       |     1 |    10 |            |          |
    |*  2 |   TABLE ACCESS BY INDEX ROWID| T2    |     1 |    10 |   103   (0)| 00:00:01 |
    |*  3 |    INDEX RANGE SCAN          | T2_I1 |   100 |       |     3   (0)| 00:00:01 |
    |   4 |  SORT GROUP BY NOSORT        |       |     1 |     9 |     3   (0)| 00:00:01 |
    |*  5 |   INDEX RANGE SCAN           | T1_N1 |     1 |     9 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - filter("T2"."ID"=:B1)
       3 - access("T2"."X1"=:B1)
       5 - access("T1"."ID"=11 AND "T1"."N1"=707)
    Je vois que le CBO sélectionne deux informations de la table t1 (id et n1) et pas uniquement n1 sur les quelles il applique le predicat 5 et transmet le resulat en ''bind variable'' (:B1) à la table T2(access("T2"."X1"=:B1)

    C'est donc peut-être à cause de cela qu'il a besoin d'un group by sur n1.

  13. #13
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    ...
    Une explication?
    ...
    Une sous-requête scalaire remplace un Outer Join. Essayez de réécrire la requête avec l’outer join.

  14. #14
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Je ne sais plus où j'en suis:

    tout ce que je demande c'est pouvoir optimiser mon code et résoudre mon problème du sum (alias total) qui j'ai l'impression ne prends pas en compte
    (SUM(T3.COL3) dans total


    ci-dessous les curseurs:

    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
     
      CURSOR CUR1
      IS
        SELECT T1.COL1, T1.COL2, T1.COL3
          FROM TABLE1 T1, TABLE2 T2
         WHERE T1.COL1 = T2.COL1
           AND T2.COL = VALEUR;
     
      CURSOR CUR2(P_COL1 TABLE1.COL1%TYPE, P_COL2 TABLE1.COL2%TYPE)
      IS
       SELECT T3.COL1, SUM(T3.COL3), (SUM(T3.COL3) + (SELECT SUM(T4.COL3) FROM TABLE4 T4 WHERE T4.COL1 = T3.COL1 AND T4.COL2 = T3.COL2)) AS TOTAL
         FROM TABLE3 L
        WHERE T3.COL1 = VALEUR
          AND T3.COL2 = VALEUR
     GROUP BY T3.COL1, T3.COL2
    merci,

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ça reste un bogue du parseur qui dépend du plan. En simplifiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH T AS (SELECT /*+ MATERIALIZE */ 1 x FROM DUAL)
    SELECT 
       (SELECT 1 FROM dual WHERE 1=x) 
    FROM T GROUP BY ();
    retourne une erreur, mais si tu enlèves le group by, alors tu enlèves l'erreur!

  16. #16
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Sincèrement je ne sais pas si on se comprend?

  17. #17
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    ça reste un bogue du parseur qui dépend du plan. En simplifiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH T AS (SELECT /*+ MATERIALIZE */ 1 x FROM DUAL)
    SELECT 
       (SELECT 1 FROM dual WHERE 1=x) 
    FROM T GROUP BY ();
    retourne une erreur, mais si tu enlèves le group by, alors tu enlèves l'erreur!
    C'est la (non)transformation de la requête qui provoque le bug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WITH T AS (SELECT /*+ no_merge */ 1 x FROM DUAL )
    SELECT  
       (SELECT 1 FROM dual WHERE 1=x) 
    FROM T GROUP BY ()
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WITH T AS (SELECT  1 x FROM DUAL )
    SELECT --+ NO_QUERY_TRANSFORMATION
       (SELECT 1 FROM dual WHERE 1=x) 
    FROM T GROUP BY ()

  18. #18
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est la (non)transformation de la requête qui provoque le bug
    Le bug c'est quand il n'y a pas d'erreur... mais bon, c'est pas un vrai bug, plutôt une bizarerie

  19. #19
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Excusez moi de vous déranger, je ne sais plus si je suis bien sur la discussion que j'ai créee?

  20. #20
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    Excusez moi de vous déranger, je ne sais plus si je suis bien sur la discussion que j'ai créee?
    Pourriez-vous ajouter un petit jeu d'essai ainsi que le résultat que vous attendez pour qu'on arrive à mieux comprendre ce que vous voulez dire par
    tout ce que je demande c'est pouvoir optimiser mon code et résoudre mon problème du sum (alias total) qui j'ai l'impression ne prends pas en compte
    (SUM(T3.COL3) dans total


Discussions similaires

  1. N'est pas une expression GROUP BY
    Par amine381 dans le forum SQL
    Réponses: 3
    Dernier message: 25/03/2013, 11h56
  2. ORA-00979: N'est pas une expression GROUP BY
    Par chakibtag dans le forum SQL
    Réponses: 2
    Dernier message: 09/07/2008, 10h22
  3. ORA-00979: N'est pas une expression GROUP BY
    Par NiGHtyWolf dans le forum Oracle
    Réponses: 3
    Dernier message: 10/05/2007, 19h11
  4. l'executable n'est pas une win32 valide
    Par joebilou dans le forum Windows
    Réponses: 4
    Dernier message: 28/06/2005, 11h53

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