Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/12/2007, 16h43   #1
Membre habitué
 
Avatar de Davboc
 
Inscription : novembre 2005
Messages : 266
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2005
Messages : 266
Points : 139
Points : 139
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 :
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 :
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
Davboc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 17h06   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
SQL*Plus t'indique la ligne en erreur, pour le débuggage tu devrais te débrouiller je pense
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 17h16   #3
Membre habitué
 
Avatar de Davboc
 
Inscription : novembre 2005
Messages : 266
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2005
Messages : 266
Points : 139
Points : 139
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 :
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 :
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
Davboc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 17h25   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
le résultat sera différent

Code :
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 :
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)
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 10h23   #5
Membre habitué
 
Avatar de Davboc
 
Inscription : novembre 2005
Messages : 266
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2005
Messages : 266
Points : 139
Points : 139
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 :
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 !
Davboc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 11h45   #6
Membre habitué
 
Avatar de Davboc
 
Inscription : novembre 2005
Messages : 266
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : novembre 2005
Messages : 266
Points : 139
Points : 139
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 ^^
Davboc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h20.


 
 
 
 
Partenaires

Hébergement Web