Вопрос

Кто-нибудь может, пожалуйста, объяснить мне, почему следующие два запроса дают разные результаты?

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'

Спасибо.

Это было полезно?

Решение

Первый позволяет порядку быть нулевым, потому что это левое соединение.
Второй этого не делает, так как он проверяет значение o.OrderType после объединения.

Эквивалентом было бы (при условии, что OrderType не может быть 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)

Другие советы

Это ЛЕВОЕ СОЕДИНЕНИЕ.

В первом случае вы можете получить меньше записей, потому что только один клиент перейдет к условию WHERE, если его заказы будут отфильтрованы по условию Cash в Join.

Во втором случае будет передано больше пар клиент-заказ, и после фильтров WHERE может остаться больше.

Убедитесь, что вам действительно нужно ЛЕВОЕ соединение, и если да, то убедитесь, какая из этих двух семантик вам нужна в данном случае.

В первом примере условие фильтрации сначала применяется для фильтрации заказов типа order cash, а затем объединяется с таблицей customer.

Во втором примере две таблицы объединяются, а затем применяется условие фильтрации.Следовательно, результат будет другим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top