|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : mai 2008 Messages : 157 ![]() |
Bonsoir a tous,
j'ai 3 tables : commandesclients commandesSalle Reglements je cherche à afficher tous les montants des commandes d'un jour donné. pour cela j'utilise la requête suivante : Code :
comment faire pour pouvoir afficher l'ensemble dans tous les cas ? faut-il utiliser autre chose que union all merci de votre aide je suis bloqué et je dois corriger mon bug rapidement |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
La syntaxe normalisée depuis 1992 pour les jointures utilise l'opérateur JOIN. Dans votre cas, puisque toutes les lignes d'une tables ne semblent pas pouvoir être mises en correspondance avec l'autre, il vous faut une jointure externe (LEFT [ou RIGHT] OUTER JOIN).
En écrivant les jointures correctement, vous auriez vu qu'il manque une condition de jointure dans votre requête ! Un GROUP BY sans fonction de regroupement dans le SELECT, ça ne sert pas à grand chose, à part imiter le DISTINCT. En l'occurrence, votre requête ne répondra pas à votre besoin puisque vous voulez tous les montants de toutes les commandes. En SQL, une date est normalement stockée dans une colonne de type DATE au format 'aaaa-mm-jj'. Pourquoi faites-vous l'union de deux fois la même requête ? Pourquoi faites vous dans la deuxième un ORDER BY reglements.daterglt alors que dans le WHERE vous ne retenez qu'une date ? L'utilisation des alias et de l'indentation rendrait votre requête plus facile et agréable à lire. Voici votre requête récrite. Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#3 | ||
|
Membre du Club
![]() Inscription : mai 2008 Messages : 157 ![]() |
merci pour votre explication
voici ce que j'ai donc fait en espérant d'avoir bien compris les nuances Code :
A+ |
||
|
|
00
|
|
|
#4 | ||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 631 ![]() |
bonjour,
Vous avez mis dans votre where : Code :
Si vous voulez gardez des left outer join il faudra plutôt utiliser ce genre de syntaxe. Code :
|
||||
|
|
10
|
|
|
#5 | |||||||||||||
![]() ![]() |
Citation:
Explication avec un exemple simple... Soit les tables suivantes : Table A idA, valA 1, 'toto' 2, 'titi' 3, 'tata' Table B idB, idA, valB, booleen 1, 2, 'riri', 0 2, 3, 'fifi', 1 Faisons une jointure externe à gauche sans condition : Code :
idA, valA, idB, valB, booleen 1, 'toto', NULL, NULL, NULL 2, 'titi', 1, 'riri', 0 3, 'tata', 2, 'fifi', 1 Ajoutons une restriction dans le WHERE sur la table B : Code :
idA, valA, idB, valB, booleen 3, 'tata', 2, 'fifi', 1 La seule ligne qui répond à la condition est celle de fifi. On n'a plus toutes les lignes de A. J'aurais obtenu le même résultat avec une jointure interne. 1ère requête sans WHERE Code :
idA, valA, idB, valB, booleen 2, 'titi', 1, 'riri', 0 3, 'tata', 2, 'fifi', 1 2ème requête avec le WHERE : Code :
idA, valA, idB, valB, booleen 3, 'tata', 2, 'fifi', 1 Reprenons maintenant la jointure externe et mettons la restriction dans la clause de jointure : Code :
idA, valA, idB, valB, booleen 1, 'toto', NULL, NULL, NULL 2, 'titi', NULL, NULL, NULL 3, 'tata', 2, 'fifi', 1 La jointure est faite sur les données restreintes au booleen = 1, c'est à dire seulement fifi mais les lignes de A sont affichées avec NULL dans les colonnes de B quand il n'y a pas de correspondance. Conclusion : Avec une jointure externe, il faut déplacer les conditions de restriction de la table externe du WHERE vers la condition de jointure. Sinon c'est l'équivalent d'une jointure interne.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||||||||||||
|
20
|
|
|
#6 |
|
Membre du Club
![]() Inscription : mai 2008 Messages : 157 ![]() |
bonjour,
Super et merci car vos explications sont claires. A+ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com