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.

Était-ce utile?

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.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top