Page 1 sur 1
Erreur de requête de jointure
Posté : 24 juil. 2006, 13:57
par SwiTz
Bonjour,
Voilà mon problème, je tente de faire une requête de jointure externe complète sur trois tables. La requête est la suivante :
Code : Tout sélectionner
insert into ca_departement select tmp_dep2.NUM_DDV, tmp_dep2.NOM_DDV, tmp_dep2.DOM_VENTE, tmp_dep1.CA_CUM, tmp_dep2.CA_CUM1, tmp_dep3.CA_AN from (tmp_dep2 full join tmp_dep1 on tmp_dep2.NOM_DDV = tmp_dep1.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep1.DOM_VENTE) full join tmp_dep3 on tmp_dep2.NOM_DDV = tmp_dep3.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep3.DOM_VENTE
Mais voici l'erreur suivante
Base non trouvée !
insert into ca_departement select tmp_dep2.NUM_DDV, tmp_dep2.NOM_DDV, tmp_dep2.DOM_VENTE, tmp_dep1.CA_CUM, tmp_dep2.CA_CUM1, tmp_dep3.CA_AN from (tmp_dep2 full join tmp_dep1 on tmp_dep2.NOM_DDV = tmp_dep1.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep1.DOM_VENTE) full join tmp_dep3 on tmp_dep2.NOM_DDV = tmp_dep3.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep3.DOM_VENTE
Erreur de syntaxe près de 'full join tmp_dep3 on tmp_dep2.NOM_DDV = tmp_dep3.NOM_DDV and tm' à la ligne 4
Je ne comprends pas !? full join permet normalement une jointure externe complète à moins que ce ne soit pas la bonne syntaxe !?
Merci d'avance
Posté : 24 juil. 2006, 18:59
par Cyrano
Si je me fie à la première ligne du message d'erreur, tu auras beau avoir une requête juste, tu n'obtiendras de toutes façons aucun retour

As-tu bien effectué une connexion au serveur et sélectionné la base appropriée avant exécution de la requête ?
Posté : 25 juil. 2006, 09:21
par SwiTz
Ah excuse moi c'est mon message d'erreur qui était mauvais dans mon code, j'avais fais un copié collé d"un fichier de connexion. Voici la mauvaise partie copiée
J'ai changé par
J'ai donc testé la requête suivante
Code : Tout sélectionner
insert into ca_departement select tmp_dep2.NUM_DDV, tmp_dep2.NOM_DDV, tmp_dep2.DOM_VENTE, tmp_dep1.CA_CUM, tmp_dep2.CA_CUM1, tmp_dep3.CA_AN from (tmp_dep2 full outer join tmp_dep1 on tmp_dep2.NOM_DDV = tmp_dep1.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep1.DOM_VENTE) full outer join tmp_dep3 on tmp_dep2.NOM_DDV = tmp_dep3.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep3.DOM_VENTE
Voici le message d'erreur
Code : Tout sélectionner
Erreur mysql !
insert into ca_departement select tmp_dep2.NUM_DDV, tmp_dep2.NOM_DDV, tmp_dep2.DOM_VENTE, tmp_dep1.CA_CUM, tmp_dep2.CA_CUM1, tmp_dep3.CA_AN from (tmp_dep2 full outer join tmp_dep1 on tmp_dep2.NOM_DDV = tmp_dep1.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep1.DOM_VENTE) full outer join tmp_dep3 on tmp_dep2.NOM_DDV = tmp_dep3.NOM_DDV and tmp_dep2.DOM_VENTE = tmp_dep3.DOM_VENTE
Erreur de syntaxe près de 'outer join tmp_dep1 on tmp_dep2.NOM_DDV = tmp_dep1.NOM_DDV and t' à la ligne 3
Posté : 26 juil. 2006, 09:17
par SwiTz
Je sais que c'est les vacances mais personne pour répondre à ma question

Posté : 26 juil. 2006, 10:42
par Hubert Roksor
Il faudrait que tu précises quelles base de données (et quelle version) tu utilises, mais aussi que tu regarde dans le manuel associé, spécialement le chapitre sur les jointures car le message d'erreur semble porter là-dessus.
Un indice : je ne me rappelle pas que MySQL supporte les "FULL OUTER JOIN", c'est certainement ce qui coince
Posté : 26 juil. 2006, 11:01
par SwiTz
La version de MySQL est la version 4.1.9. Je vais regarder dans le manuel
Posté : 26 juil. 2006, 11:32
par Hubert Roksor
À la rigueur, en relisant ton premier message je me dis que le mieux serait encore que tu expliques brièvement ce que tu souhaites obtenir. Qu'entends-tu par "jointure externe complète" ? La requête suivante ne retourne-t'elle pas les informations que tu souhaites obtenir ? (en fait c'est la même requête, j'ai remplacé tes "full join" par "JOIN" et la clause ON par une clause USING pour des raisons de clarté)
Code : Tout sélectionner
SELECT t2.NUM_DDV, t2.NOM_DDV, t2.DOM_VENTE, t1.CA_CUM, t2.CA_CUM1, t3.CA_AN
FROM tmp_dep2 t2
JOIN tmp_dep1 t1 USING (NOM_DDV, DOM_VENTE)
JOIN tmp_dep3 t3 USING (NOM_DDV, DOM_VENTE)
Posté : 26 juil. 2006, 13:54
par SwiTz
- tmp_dep1 contient les chiffres d'affaires de janvier à mai des directeurs pour l'année N-1
- tmp_dep2 contient les chiffres d'affaires de janvier à mai des directeurs pour l'année N
- tmp_dep3 contient les chiffres d'affaires des directeurs pour l'année N
Certains chiffres d'affaires ne sont pas dans toutes les tables car des produits disparaissent ou apparaissent. Mais je voudrais les prendrent compte pour le calcul de l'évolution du chiffre d'affaires.
J'espère que j'ai été clair :s
Posté : 26 juil. 2006, 14:34
par Hubert Roksor
Il te faut absolument une table qui recense tous les "produits", sinon tu vas t'embêter. En fait il te faudrait probablement revoir en intégralité le design de la base de données
Au pire, trouve ou crée une table qui contient tous les (NOM_DDV, DOM_VENTE) présents dans tmp_dep[123] puis crée une requête qui part de cette nouvelle table et utilise des jointures "LEFT JOIN" vers les 3 autres. On va l'appeler "tmp_dep" pour l'exemple et on va dire qu'elle contient deux colonnes qui forment une clé primaire (NOM_DDV, DOM_VENTE)
Code : Tout sélectionner
INSERT IGNORE INTO tmp_dep (NOM_DDV, DOM_VENTE) SELECT NOM_DDV, DOM_VENTE FROM tmp_dep1;
INSERT IGNORE INTO tmp_dep (NOM_DDV, DOM_VENTE) SELECT NOM_DDV, DOM_VENTE FROM tmp_dep2;
INSERT IGNORE INTO tmp_dep (NOM_DDV, DOM_VENTE) SELECT NOM_DDV, DOM_VENTE FROM tmp_dep3;
La nouvelle requête ressemblerait alors à
Code : Tout sélectionner
SELECT t2.NUM_DDV, t2.NOM_DDV, t2.DOM_VENTE, t1.CA_CUM, t2.CA_CUM1, t3.CA_AN
FROM (((tmp_dep t
LEFT JOIN tmp_dep1 t1 USING (NOM_DDV, DOM_VENTE))
LEFT JOIN tmp_dep2 t2 USING (NOM_DDV, DOM_VENTE))
LEFT JOIN tmp_dep3 t3 USING (NOM_DDV, DOM_VENTE))
Posté : 31 juil. 2006, 10:45
par SwiTz
Ton approche était plus correcte, mais au final il y avait des NOM_DDV à vide ce qui n'était pas bon pour la suite.
J'ai donc procédé de la manière suivante. J'ai créé une table tmp_dep qui contient le CA_CUM et CA_CUM1. Et j'ai éxécuté la requête suivante :
Code : Tout sélectionner
insert into tmp_dep
(
SELECT t1.NUM_DDV, t1.NOM_DDV, t1.DOM_VENTE, t1.CA_CUM, t2.CA_CUM1
FROM tmp_dep1 t1
LEFT OUTER JOIN tmp_dep2 t2
using (NOM_DDV,DOM_VENTE)
)
union
(
SELECT t2.NUM_DDV, t2.NOM_DDV, t2.DOM_VENTE, t1.CA_CUM, t2.CA_CUM1
FROM tmp_dep1 t1
RIGHT OUTER JOIN tmp_dep2 t2
using (NOM_DDV,DOM_VENTE)
)
Puis j'ai éxécuté la requête suivante :
Code : Tout sélectionner
insert into ca_departement
(
select t.NUM_DDV, t.NOM_DDV, t.DOM_VENTE, t.CA_CUM, t.CA_CUM1, t3.CA_AN
from tmp_dep t left outer join tmp_dep3 t3
using (NOM_DDV,DOM_VENTE)
)
union
(
select t3.NUM_DDV, t3.NOM_DDV, t3.DOM_VENTE, t.CA_CUM, t.CA_CUM1, t3.CA_AN
from tmp_dep t right outer join tmp_dep3 t3
using (NOM_DDV,DOM_VENTE)
)
Et le résultat final est celui escompté

Bon la manip est un peu fastidieuse mais elle a l'avantage de fonctionner.
En tout cas, je vous remercie tous pour votre aide.
