2

谁能向我解释为什么以下两个查询会产生不同的结果?

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'

谢谢。

4

4 回答 4

5

第一个允许 order 为 NULL,因为它是左连接。
第二个没有,因为它在连接后检查 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)
于 2009-07-10T10:06:42.883 回答
0

这是左连接。

在第一种情况下,您可能会获得较少的记录,因为如果他的订单被 Join 中的 Cash 条件过滤掉,则只有一个客户会传递到 WHERE 条件。

在第二种情况下,更多的客户订单对将通过,并且在 WHERE 过滤器之后可能会留下更多。

确保您确实需要 LEFT JOIN,如果需要,请确定在这种情况下您需要这两种语义中的哪一种。

于 2009-07-10T10:10:28.367 回答
0

A great explanation:

Ask the Experts: Terry Purcell on Outer Joins

于 2009-07-10T13:16:18.057 回答
0

In the first example, filter condition is first applied to filter orders of order type cash and then joined with customer table.

In the second example, two tables are joined and then filtered condition is applied. Hence the result will be different.

于 2013-02-26T07:36:20.033 回答