为什么这两个查询返回了不同数量的行

13 浏览
0 Comments

为什么这两个查询返回了不同数量的行

我使用的是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;

0
0 Comments

为什么这两个查询返回不同数量的行?

这个问题的出现原因是在第一个查询中,在where子句中引用了一个表,导致了外部查询的行被删除了。解决方法是将该条件移到连接条件中。

以下是修复后的查询:

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';

0
0 Comments

这两个查询返回不同行数的原因是由于第一个查询中的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';

谢谢,这个链接也很有帮助。

0