Differenza tra Stato da Dove e Condizioni Iscriviti a
-
12-09-2019 - |
Domanda
Qualcuno può spiegare a me perché i seguenti due query producono risultati diversi?
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'
Grazie.
Soluzione
Il primo permette l'ordine di essere NULL, perché è un join sinistro.
Il secondo non lo fa, come si controlla il valore della o.OrderType dopo il join.
L'equivalente sarebbe (supponendo OrderType non può essere 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)
Altri suggerimenti
È il LEFT JOIN.
Nel primo caso è possibile ottenere meno record, perché un solo cliente passerà per la condizione in cui, se i suoi ordini vengono filtrati dalla condizione in contanti nella Join.
Nel secondo caso, più coppie cliente ordine passeranno, e più possono essere sinistra dopo i filtri WHERE.
Assicurati davvero necessario il LEFT JOIN, e se è così, quindi assicurarsi che di questi due semantiche è necessario in questo caso.
Una grande spiegazione:
Nel primo esempio, condizione di filtro viene dapprima applicato a filtrare ordini del tipo di ordine denaro e poi uniti con tavolo cliente.
Nel secondo esempio, due tabelle sono uniti e viene applicata stato poi filtrato. Quindi il risultato sarà diverso.