Pbm requête update

gbwin Messages postés 9 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 5 octobre 2004 - 5 nov. 2003 à 18:34
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 - 6 nov. 2003 à 16:44
bonjour voilà j'ai un petit pbm urgent à résoudre c pour mon taf donc j'espère que vous pourrez m'aider... Merci d'avance
Voilà le topo:
j'ai 3 tables constitué comme tel:
Etablissement(rne, nom, subv1,subv2,....)
BonDeCommande(rne, prix1,prix2,....)
Facture(rne, prix1, prix2)

Et je dois fair un états qui regrouperer des infos des 3 table de la sorte:

rne / nom / subv1+2 / bdc_prix1+2 / fact_ prix1+2
----------------------------------------------------------
059 / aaa / 50 000 / 1 000 / 0
064 / bbb / 1 500 / 500 / 500
700 / zzz / 25 100 / 0 / 0

etc...

Le hic c en plus de ca, cette liste doit renvoyé TOUT les etb, qu'ils aient des bdc ou pas, idem pour les factures et ca, je ne sais pas le faire, et je n'y arrive pas j'ai divers pbm selon les méthode que j'ai essayé:

1: un état utilise qu'une requête et celle que je fais me renvois que les tuples résultant des facturation vu que la relation va de etb-->bdc--->fact...
2: j'ai essayer avec une table intermédiaire contenant tout les champs mais vide et qui serait mis a jour en 3 fois pour perdre aucune donnée (liste des etb avec restant vide, ajout des données bdc selon les etb, ajout des facture pour les etb en cause) mais je bug sur la maj de ma table temp par rapport à ma table bdc avec un where temp.rne = bdc.rne ?

J'espère que j'ai pas trop foiré dans les explications, je vous remercie d'avance pour votre aide quel quel soit...
Bonsoir
Gribouille

4 réponses

cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
5 nov. 2003 à 18:57
J'essaye de schématiser :
Etablissement -> BonDeCommande -> Facture

Dans un cas pareil, la jointure externe est ton amie.
Pour la syntaxe exacte, il faudrait connaître le SGBD utilisé et sa version.
0
m2rtech Messages postés 239 Date d'inscription mercredi 9 octobre 2002 Statut Membre Dernière intervention 20 février 2012
6 nov. 2003 à 03:33
salut

essaie un left join
corrige eventuellement les noms de table et les nom de champs. Il FAUT que l'indexe de ta table etablissement soit de type "sans doublons" et les 2 autres "avec doublons"

SELECT etablissement.rne, nom, subv1+subv2, bondecommande.prix1+ bondecommande.prix2, factures.prix1+factures.prix2
FROM
(etablissement LEFT JOIN bondecommande ON etablissement.rne = bondecommande.rne)
LEFT JOIN factures ON etablissement.rne = factures.rne
0
gbwin Messages postés 9 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 5 octobre 2004
6 nov. 2003 à 08:35
Je te dis un grand MERCI M. M2RTECH
Sur ce coup là chapeau, je ne connaissais pas les LEFT JOIN quand je fesais ma requête il mettait tout le temps INNER JOIN mais je ne sais pas non plus a quoi ca sert, les porf nous ont toujours fais retirer ses truc pour faire la jointure nous même avec un WHERE tbl1.chp = tbl2.chp...
Pourrais-tu m'expliquer ca en qlq mots si c possible, merci... merci... merci...
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
6 nov. 2003 à 16:44
Exemple : on prend deux tables CLIENT et BILLET avec la relation BILLET -> CLIENT ...
un CLIENT peut avoir 1 à n BILLET
un BILLET n'a que 0 ou 1 CLIENT (0 = invendu par exemple)

La table BILLET contient donc l'id du CLIENT qui l'a acheté.

si on fait une requête INNER JOIN :
SELECT NumBillet, NomClient FROM BILLET INNER JOIN CLIENT On BILLET.NumClient = CLIENT.NumClient

Cette requête ne va lire que les tuples pour lesquels le billet a un client (grosso modo, les billets achetés)

si on fait une requête LEFT JOIN :
SELECT NumBillet, NomClient FROM BILLET LEFT JOIN CLIENT On BILLET.NumClient = CLIENT.NumClient

Cette requête va récupérer tous les tuples avec un BILLET, y compris ceux sans CLIENT, NomClient contiendra la valeur NULL.
0
Rejoignez-nous