Join中Where和Condition条件的区别

时间:2009-07-10 10:03:15

标签: sql-server left-join conditional-statements

任何人都可以向我解释为什么以下两个查询产生不同的结果?

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 个答案:

答案 0 :(得分:5)

第一个允许订单为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)

答案 1 :(得分:0)

这是LEFT JOIN。

在第一个实例中,您可能会获得更少的记录,因为如果他的订单被加入中的现金条件过滤掉,只有一个客户会转到WHERE条件。

在第二个实例中,将传递更多客户订单对,并且可以在WHERE过滤器之后留下更多客户订单对。

确保你真的需要LEFT JOIN,如果是,那么确保在这种情况下你需要这两种语义中的哪一种。

答案 2 :(得分:0)

答案 3 :(得分:0)

在第一个示例中,过滤条件首先应用于过滤订单类型现金的订单,然后与客户表连接。

在第二个示例中,连接了两个表,然后应用了过滤条件。因此结果会有所不同。