Différence entre la condition Où et Condition Rejoindre
-
12-09-2019 - |
Question
Quelqu'un peut-il me s'il vous plaît expliquer pourquoi les deux requêtes donnent des résultats différents suivant?
SELECT
o.*
FROM
Customer c
LEFT JOIN
[Order] o ON o.CustomerID = c.CustomerID AND o.OrderType = 'Cash'
WHERE
c.Country = 'USA'
SELECT
o.*
FROM
Customer c
LEFT JOIN
[Order] o ON o.CustomerID = c.CustomerID
WHERE
c.Country = 'USA'
AND
o.OrderType = 'Cash'
Merci.
La solution
Le premier permet l'ordre d'être NULL, car il est une jointure gauche.
Le second n'a pas, comme il vérifie la valeur de o.OrderType après la jointure.
L'équivalent serait (en supposant OrderType ne peut pas être NULL)
SELECT
o.*
FROM
Customer c
LEFT JOIN
[Order] o ON o.CustomerID = c.CustomerID
WHERE
c.Country = 'USA'
AND
(o.OrderType = 'Cash' OR o.OrderType IS NULL)
Autres conseils
Il est l'LEFT JOIN.
Dans le premier cas, vous pouvez obtenir moins des enregistrements, car seul un client passera par la condition WHERE si ses ordres sont filtrés par l'état de trésorerie Rejoindre.
Dans le second cas, plusieurs paires d'ordre client passeront, et plus peuvent être laissés après les filtres WHERE.
Assurez-vous que vous avez besoin de la realy LEFT JOIN, et si oui, alors assurez-vous que ces deux sémantiques dont vous avez besoin dans ce cas.
Une grande explication:
Demandez aux experts: Terry Purcell sur des jointures externes
Dans le premier exemple, l'état du filtre est d'abord appliqué pour filtrer les commandes de trésorerie de type de commande, puis rejoint avec table à la clientèle.
Dans le second exemple, deux tables sont jointes et l'état puis filtré est appliqué. D'où le résultat sera différent.