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.

È stato utile?

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.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top