Pregunta

Puede alguien por favor me explique por qué las dos consultas siguientes resultados diferentes?

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'

Gracias.

¿Fue útil?

Solución

La primera de ellas permite que el fin de ser NULL, porque es una combinación izquierda.
El segundo no lo hace, ya que comprueba el valor de o.OrderType después de la unión.

El equivalente sería (suponiendo OrderType no puede ser nulo)

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)

Otros consejos

Se unirse a la IZQUIERDA.

En el primer caso puede obtener menos registros, ya que sólo un cliente pasará a través de la condición en la que si sus órdenes son filtrados por la condición de efectivo en Unir.

En el segundo ejemplo, más pares cliente orden pasarán, y más pueden ser la izquierda después de los filtros dónde.

Asegúrese de que necesita realmente la combinación izquierda, y si es así, entonces asegúrese de cuál de estos dos semánticas que necesita en este caso.

En el primer ejemplo, condición de filtro se aplica primero para filtrar las órdenes de tipo de orden efectivo y luego se unió con tabla de clientes.

En el segundo ejemplo, dos tablas se unen y se aplica la condición después se filtró. Por lo tanto el resultado será diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top