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-00918: column ambiguously defined" alors que toutes mes colonnes sont préfixées


Sujet :

SQL Oracle

  1. #1
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut "ORA-00918: column ambiguously defined" alors que toutes mes colonnes sont préfixées
    Bonjour

    J'ai essayé, afin de mieux la comprendre pour la modifier, de réécrire une requete oracle 8i à la mode ANSI (pour Oracle 10g). Malheureusement une erreur est apparue après la réécriture...

    Voilà la requete originale :

    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
    SELECT TO_NUMBER(NVL(PL.HEURE_DEPART,'2359')) AS HEURE_DEPART, 
           PL.COD_LIGNE_EXPEDITION AS LIGNE_EXPEDITION, 
           PL.COD_TOURNEE, T.NOM_TOURNEE, PL.COD_TRANSPORTEUR, 
           TR.NOM_TRANSPORTEUR, SUM(NVL(EX.NB_COLIS_PREVU,0)) AS NB_COLIS_PREVU, 
           SUM(NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_PREPARE, 
           SUM(NVL(EX.NB_COLIS_PREVU,0)-NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_RESTANT, 
           SUM(DECODE(EX.COD_SOC_COM, '5', 1, 0)) AS NB_COMMANDE, 
           SUM(DECODE(EX.COD_SOC_COM, '5', 1, 0) *(1 - NVL(EX.IS_PREVISION, 0))) AS NB_SERVIS, 
           SUM(DECODE(EX.COD_SOC_COM, '5',1,0) * NVL(EX.IS_BL_RECU,0)) AS NB_BL, 
           SUM(DECODE(EX.COD_SOC_COM, '5', 1, 0))-SUM(DECODE(EX.COD_SOC_COM ,'5',1,0) * NVL(EX.IS_BL_RECU,0)) AS TOT,
           SUM(decode(ELC.COD_SOC_COM, '5', 1,  0)) AS IS_EDITE 
     
    FROM REF_EXPEDITION EX, REF_PLAN_LIGNE PL, REF_EDITE_LISTE_COLISAGE ELC, REF_TOURNEES_TRANSPORT T, 
         REF_TRANSPORTEURS TR
    WHERE EX.DATE_EXPEDITION = ELC.DATE_EDITION_LISTE (+) 
      AND EX.COD_SOC_COM = ELC.COD_SOC_COM (+) 
      AND EX.NUM_TOURNEE = ELC.COD_TOURNEE (+) 
      and EX.NUM_TOURNEE = PL.COD_TOURNEE 
      and EX.NUM_TOURNEE = T.COD_TOURNEE 
      AND PL.COD_TRANSPORTEUR = TR.COD_TRANSPORTEUR 
      AND EX.DATE_EXPEDITION = TO_DATE('08/12/2007','dd/mm/yyyy') 
      AND DATE_DEBUT <= TO_DATE('08/12/2007','dd/mm/yyyy') 
      AND DATE_FIN >= TO_DATE('08/12/2007','dd/mm/yyyy') 
      AND COD_JOUR IN (0,1) AND PL.COD_SITE_LOGISTIQ = '907' 
      AND PL.COD_TOURNEE in (214,221,286,295) 
      AND (EX.NO_ZONE_TARIF_TRANSPORT = '5' OR  EX.COD_SOC_COM = '5')  
     
    GROUP BY PL.HEURE_DEPART, PL.COD_LIGNE_EXPEDITION, PL.COD_TOURNEE, T.NOM_TOURNEE, PL.COD_TRANSPORTEUR,
             TR.NOM_TRANSPORTEUR
    Et voici la requête que j'ai réécrite :

    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
    SELECT TO_NUMBER(NVL(PL.HEURE_DEPART,'2359')) AS HEURE_DEPART, 
           PL.COD_LIGNE_EXPEDITION AS LIGNE_EXPEDITION, 
           PL.COD_TOURNEE, T.NOM_TOURNEE, PL.COD_TRANSPORTEUR, 
           TR.NOM_TRANSPORTEUR, SUM(NVL(EX.NB_COLIS_PREVU,0)) AS NB_COLIS_PREVU, 
           SUM(NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_PREPARE, 
           SUM(NVL(EX.NB_COLIS_PREVU,0)-NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_RESTANT, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0)) AS NB_COMMANDE, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0) *(1 - NVL(EX.IS_PREVISION, 0))) AS NB_SERVIS, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0) * NVL(EX.IS_BL_RECU,0)) AS NB_BL, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0))-SUM(DECODE(EX.COD_SOC_COM ,'5',1,0) * NVL(EX.IS_BL_RECU,0)) AS TOT,
           SUM(decode(ELC.COD_SOC_COM, 5, 1, 0)) AS IS_EDITE
     
    FROM REF_EXPEDITION EX
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.DATE_EXPEDITION = ELC.DATE_EDITION_LISTE
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.COD_SOC_COM = ELC.COD_SOC_COM
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.NUM_TOURNEE = ELC.COD_TOURNEE
    INNER JOIN REF_PLAN_LIGNE PL
            ON EX.NUM_TOURNEE = PL.COD_TOURNEE
                INNER JOIN REF_TRANSPORTEURS TR
                        ON PL.COD_TRANSPORTEUR = TR.COD_TRANSPORTEUR          
    INNER JOIN REF_TOURNEES_TRANSPORT T
            ON EX.NUM_TOURNEE = T.COD_TOURNEE 
     
         WHERE EX.DATE_EXPEDITION = TO_DATE('08/12/2007','dd/mm/yyyy') 
           AND PL.DATE_DEBUT <= TO_DATE('08/12/2007','dd/mm/yyyy') 
           AND PL.DATE_FIN >= TO_DATE('08/12/2007','dd/mm/yyyy') 
           AND PL.COD_JOUR IN (0,1) 
           AND PL.COD_SITE_LOGISTIQ = '907' 
           AND PL.COD_TOURNEE IN (214,221,286,295) 
           AND (EX.NO_ZONE_TARIF_TRANSPORT = '5' OR  EX.COD_SOC_COM = '5')  
     
      GROUP BY PL.HEURE_DEPART, PL.COD_LIGNE_EXPEDITION, PL.COD_TOURNEE, T.NOM_TOURNEE, PL.COD_TRANSPORTEUR,
             TR.NOM_TRANSPORTEUR
    Une erreur "ORA-00918: column ambiguously defined" est venue se glisser entretemps alors que toutes mes colonnes sont préfixées... Il me semble pourtant que cette erreur apparaît lorsqu'on ne préfixe pas les colonnes avec les noms de table et que deux tables ont des colonnes au nom identique non ?

    Merci de votre aide

    David

  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
    SQL*Plus t'indique la ligne en erreur, pour le débuggage tu devrais te débrouiller je pense

  3. #3
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    SQL Developper m'indiquait la ligne 1. Mais j'ai tout vérifié et toutes mes colonnes sont bien préfixées...

    J'ai fouiné un peu plus profond dans les pages de google et je suis tombé sur cet article :

    http://www.mydatabasesupport.com/ora...y-defined.html

    Apparemment l'exception se lance quelquefois dans le cas de jointures externes. Bien que l'article ne parle d'erreur qu'en cas de full outer join, j'ai tenté de modifier mes jointures externes et... Ca marche.

    Pour info j'ai changé la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.DATE_EXPEDITION = ELC.DATE_EDITION_LISTE
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.COD_SOC_COM = ELC.COD_SOC_COM
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.NUM_TOURNEE = ELC.COD_TOURNEE
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON EX.DATE_EXPEDITION = ELC.DATE_EDITION_LISTE 
            AND EX.COD_SOC_COM = ELC.COD_SOC_COM 
            AND EX.NUM_TOURNEE = ELC.COD_TOURNEE
    Bizarre autant qu'étrange... Mais l'important c'est que ça marche ^^
    Si quelqu'un a une explication à me fournir au passage je serai bien curieux de la connaître

  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
    le résultat sera différent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC1
            ON EX.DATE_EXPEDITION = ELC1.DATE_EDITION_LISTE
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC2
            ON EX.COD_SOC_COM = ELC2.COD_SOC_COM
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC3
            ON EX.NUM_TOURNEE = ELC3.COD_TOURNEE
    n'est pas identique à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC
            ON (EX.DATE_EXPEDITION = ELC.DATE_EDITION_LISTE
            AND EX.COD_SOC_COM = ELC.COD_SOC_COM
            AND EX.NUM_TOURNEE = ELC.COD_TOURNEE)

  5. #5
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    Pourrais-tu m'en dire un peu plus sur la différence entre les deux syntaxes stp ?

    La première me renvoie (dans le cas de mon test du moins) le même résultat que la version 8i de la requête.

    Cette requête fait en réalité partie d'un Union, la voilà au complet :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    SELECT TO_NUMBER(NVL(PL.HEURE_DEPART,'2359')) AS HEURE_DEPART, 
           PL.COD_LIGNE_EXPEDITION AS LIGNE_EXPEDITION, 
           PL.COD_TOURNEE, 
           T.NOM_TOURNEE, 
           PL.COD_TRANSPORTEUR, 
           TR.NOM_TRANSPORTEUR, 
           SUM(NVL(EX.NB_COLIS_PREVU,0)) AS NB_COLIS_PREVU, 
           SUM(NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_PREPARE, 
           SUM(NVL(EX.NB_COLIS_PREVU,0)-NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_RESTANT, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0)) AS NB_COMMANDE, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0) *(1 - NVL(EX.IS_PREVISION, 0))) AS NB_SERVIS, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0) * NVL(EX.IS_BL_RECU,0)) AS NB_BL, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0))-SUM(DECODE(EX.COD_SOC_COM ,'5',1,0) * NVL(EX.IS_BL_RECU,0)) AS TOT,
           SUM(decode(ELC1.COD_SOC_COM, 5, 1, 0)) AS IS_EDITE
     
    FROM REF_EXPEDITION EX
     
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC1
            ON EX.DATE_EXPEDITION = ELC1.DATE_EDITION_LISTE
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC2
            ON EX.COD_SOC_COM = ELC2.COD_SOC_COM
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC3
            ON EX.NUM_TOURNEE = ELC3.COD_TOURNEE
    INNER JOIN REF_PLAN_LIGNE PL
            ON EX.NUM_TOURNEE = PL.COD_TOURNEE
                INNER JOIN REF_TRANSPORTEURS TR
                        ON PL.COD_TRANSPORTEUR = TR.COD_TRANSPORTEUR          
    INNER JOIN REF_TOURNEES_TRANSPORT T
            ON EX.NUM_TOURNEE = T.COD_TOURNEE 
     
    WHERE EX.DATE_EXPEDITION = TO_DATE('08/12/2007','dd/mm/yyyy') 
      AND PL.DATE_DEBUT <= TO_DATE('08/12/2007','dd/mm/yyyy') 
      AND PL.DATE_FIN >= TO_DATE('08/12/2007','dd/mm/yyyy') 
      AND PL.COD_JOUR IN (0,1) 
      AND PL.COD_SITE_LOGISTIQ = '907' 
      AND PL.COD_TOURNEE IN (214,221,286,295) 
      AND (EX.NO_ZONE_TARIF_TRANSPORT = '5' OR  EX.COD_SOC_COM = '5')  
     
    GROUP BY PL.HEURE_DEPART, PL.COD_LIGNE_EXPEDITION, PL.COD_TOURNEE, T.NOM_TOURNEE, PL.COD_TRANSPORTEUR,
             TR.NOM_TRANSPORTEUR  
     
    UNION 
     
    SELECT 2359 AS HEURE_DEPART,  999999 AS LIGNE_EXPEDITION,   EX.NUM_TOURNEE ,  T.NOM_TOURNEE , 
           999 AS COD_TRANSPORTEUR, ' ' AS NOM_TRANSPORTEUR , 
           SUM(NVL(EX.NB_COLIS_PREVU,0)) AS NB_COLIS_PREVU, 
           SUM(NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_PREPARE, 
           SUM(NVL(EX.NB_COLIS_PREVU,0)-NVL(EX.NB_COLIS_PREPARE,0)) AS NB_COLIS_RESTANT, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0)) AS NB_COMMANDE, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0) *(1 - NVL(EX.IS_PREVISION, 0))) AS NB_SERVIS, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0) * NVL(EX.IS_BL_RECU,0)) AS NB_BL, 
           SUM(DECODE(EX.COD_SOC_COM, 5, 1, 0))-SUM(DECODE(EX.COD_SOC_COM ,5,1,0) * NVL(EX.IS_BL_RECU,0)) AS TOT, 
           SUM(decode(ELC.COD_SOC_COM, 5, 1, 0)) AS IS_EDITE 
     
    FROM REF_EXPEDITION EX, REF_TOURNEES_TRANSPORT T,REF_EDITE_LISTE_COLISAGE ELC  
     
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC1
    --        ON EX.DATE_EXPEDITION = ELC1.DATE_EDITION_LISTE
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC2
            ON EX.COD_SOC_COM = ELC2.COD_SOC_COM
    RIGHT OUTER JOIN REF_EDITE_LISTE_COLISAGE ELC3
            ON EX.NUM_TOURNEE = ELC3.COD_TOURNEE
    INNER JOIN REF_TOURNEES_TRANSPORT T
            ON EX.NUM_TOURNEE = T.COD_TOURNEE 
    WHERE EX.DATE_EXPEDITION = TO_DATE('08/12/2007','dd/mm/yyyy')
      AND EX.NUM_TOURNEE NOT IN(  SELECT COD_TOURNEE 
                                    FROM REF_PLAN_LIGNE PL
                                   WHERE EX.DATE_EXPEDITION = TO_DATE('08/12/2007','dd/mm/yyyy') 
                                     AND PL.DATE_DEBUT <= TO_DATE('08/12/2007','dd/mm/yyyy') 
                                     AND PL.DATE_FIN >= TO_DATE('08/12/2007','dd/mm/yyyy') 
                                     AND PL.COD_JOUR IN (0,1) 
                                     AND (EX.NO_ZONE_TARIF_TRANSPORT = '5' OR  EX.COD_SOC_COM = '5') 
                                     AND PL.COD_SITE_LOGISTIQ = '907'  )
      AND T.COD_TOURNEE in (214,221,286,295) 
      AND (EX.COD_SOC_COM = '5' OR EX.NO_ZONE_TARIF_TRANSPORT = '5')   
    GROUP BY EX.NUM_TOURNEE,T.NOM_TOURNEE
    J'ai une erreur "ORA-00904: "EX"."DATE_EXPEDITION": invalid identifier" au niveau de la condition "ON" du premier RIGHT OUTER JOIN de la seconde partie de la requête (l 58) que j'ai mis en commentaire pour que vous la voyiez... Auriez vous une idée de sa cause ?

    Merci de votre aide !

  6. #6
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    J'ai finalement trouvé l'erreur, qui n'était en fait pas du tout au niveau de EX.DATE_EXPEDITION : j'avais simplement oublié de supprimer du FROM les tables dont les jointures avaient changé sur la seconde requête

    Le message d'erreur n'était pas d'une grande aide ^^

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

Discussions similaires

  1. [10g] Full outer join, column ambiguously defined
    Par Julien59 dans le forum SQL
    Réponses: 3
    Dernier message: 14/11/2012, 14h03
  2. Réponses: 5
    Dernier message: 29/12/2010, 15h13
  3. Problème avec column ambiguously defined
    Par eric___ dans le forum SQL
    Réponses: 2
    Dernier message: 16/12/2010, 11h22
  4. Réponses: 1
    Dernier message: 13/01/2010, 12h22
  5. Réponses: 4
    Dernier message: 12/10/2008, 20h14

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