为什么这两个查询返回了不同数量的行
为什么这两个查询返回了不同数量的行
我使用的是adventureworks2012数据库:
第一个查询返回了43行且没有空值,而第二个查询返回了超过19,000行且有很多空值。
我原以为外连接会返回左侧查询的行,即使条件不满足,所以这两个查询应该是等价的?
--1
SELECT c.CustomerID, s.SalesOrderID, s.OrderDate FROM Sales.Customer AS c LEFT OUTER JOIN Sales.SalesOrderHeader AS s ON c.CustomerID = s.CustomerID WHERE s.OrderDate = '2005/07/01';
--2
WITH orders AS ( SELECT SalesOrderID, CustomerID, OrderDate FROM Sales.SalesOrderHeader WHERE OrderDate = '2005/07/01' ) SELECT c.CustomerID, orders.SalesOrderID, orders.OrderDate FROM Sales.Customer AS c LEFT OUTER JOIN orders ON c.CustomerID = orders.CustomerID ORDER BY orders.OrderDate DESC;
这两个查询返回不同行数的原因是由于第一个查询中的WHERE
子句。WHERE
子句过滤了两个表连接后的最终结果。为了解决这个问题,你需要将条件从WHERE
子句移动到ON
子句中,这样可以在将表Sales.SalesOrderHeader
连接到另一个表Sales.Customer
之前,首先对记录进行过滤。你可以在这里找到更多信息。
以下是修改后的查询语句:
SELECT c.CustomerID, s.SalesOrderID, s.OrderDate FROM Sales.Customer AS c LEFT OUTER JOIN Sales.SalesOrderHeader AS s ON c.CustomerID = s.CustomerID AND s.OrderDate = '2005/07/01';
谢谢,这个链接也很有帮助。