2009-07-10 8 views
2

Quelqu'un peut-il m'expliquer pourquoi les deux requêtes suivantes donnent des résultats différents?Différence entre Condition dans Où et Condition dans Join

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.

Répondre

5

Le premier permet à la commande d'être NULL, car il s'agit d'une jointure à gauche.
La seconde ne le fait pas, car elle 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) 
+0

C'est logique, merci Greg. * moment d'eureka * – staterium

0

Il est l'LEFT JOIN. Dans un premier temps, vous pouvez obtenir moins d'enregistrements, car un seul client passera à la condition WHERE si ses ordres sont filtrés par la condition de trésorerie dans Join. Dans le second cas, plus de paires client-ordre passera, et plus peut être laissé après les filtres WHERE.

Assurez-vous que vous avez vraiment besoin de LEFT JOIN, et si c'est le cas, assurez-vous de laquelle de ces deux sémantiques vous avez besoin dans ce cas.

0

Dans le premier exemple, l'état du filtre est d'abord appliqué pour filtrer les commandes de trésorerie de type de commande, puis jointe à la table des clients.

Dans le deuxième exemple, deux tables sont jointes, puis la condition filtrée est appliquée. Par conséquent, le résultat sera différent.

Questions connexes