任何人都可以向我解释为什么以下两个查询产生不同的结果?
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'
感谢。
答案 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)
在第一个示例中,过滤条件首先应用于过滤订单类型现金的订单,然后与客户表连接。
在第二个示例中,连接了两个表,然后应用了过滤条件。因此结果会有所不同。