在联接或位置内的条件

在联接或位置内的条件

有什么不同(表现、最佳实践等.)在JOIN子句中添加条件与WHERE子句之间?

例如.。

-- Condition in JOINSELECT *FROM dbo.Customers AS CUSINNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerIDAND CUS.FirstName = 'John'-- Condition in WHERESELECT *FROM 
dbo.Customers AS CUSINNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerIDWHERE CUS.FirstName = 'John'

你喜欢哪一个(也许是为什么)?


喵喵时光机
浏览 711回答 3
3回答

芜湖不芜

对于内部连接,我并没有真正注意到它们之间的区别(但是与所有性能调优一样,您需要在您的条件下对照数据库进行检查)。然而,如果您使用的是左或右联接,则条件会产生巨大的不同。例如,考虑以下两个查询:SELECT *FROM dbo.Customers AS CUS  LEFT JOIN dbo.Orders AS ORD  ON CUS.CustomerID = ORD.CustomerIDWHERE ORD.OrderDate >'20090515'SELECT *FROM dbo.Customers AS CUS  LEFT JOIN dbo.Orders AS ORD  ON CUS.CustomerID = ORD.CustomerIDAND ORD.OrderDate >'20090515'第一个将只给出那些日期晚于2009年5月15日的订单记录,从而将左连接转换为内部连接。第二个会给出这些记录,再加上没有订单的任何客户。结果集非常不同,取决于您放置条件的位置。(如果仅选择*,则不应在生产代码中使用。)这种情况的例外情况是,您只希望在一个表中看到记录,而不希望看到另一个表中的记录。然后,对条件使用WHERE子句,而不是JOIN。SELECT *FROM dbo.Customers AS CUS  LEFT JOIN dbo.Orders AS ORD  ON CUS.CustomerID = ORD.CustomerIDWHERE ORD.OrderID is null

杨__羊羊

大多数RDBMS产品将对这两个查询进行相同的优化。在PeterGulutzan和TrudyPelzer的“SQL性能调优”中,他们测试了多个品牌的RDBMS,发现性能没有差别。我更喜欢将联接条件与查询限制条件分开。如果你用OUTER JOIN有时,在JOIN子句中添加条件是必要的。
打开App,查看更多内容
随时随地看视频慕课网APP