我需要从Left Table返回所有记录即使where where

时间:2016-05-25 14:43:36

标签: sql ms-access

您好我有两个表(库存和销售)。

我正在尝试获取SKU在给定日期范围内的总销售额的库存的当前视图,其中两个表中都有SKU。即使在日期范围内没有销售,我也希望退回SKU(如果它在where子句中不存在)。

我试过使用"之间" date where子句,但只返回本周销售的SKU。我还想包括本周未售出的SKU,它们应该有0个Sales $和Qty Ordered值。

我尝试过使用EXIST条款,但没有成功。

这是我的问题:

SELECT Inventory.SKU, Sum([Sales].[Sales $]), Inventory.Qty, Sum([Sales].Qty Ordered)
FROM Inventory LEFT JOIN Sales ON Inventory.SKU = [Sales].[Style Id]
WHERE ((([Sales].[Order date]) Between #5/14/2016# And #5/22/2016#))
GROUP BY Inventory.SKU, Inventory.Qty;

2 个答案:

答案 0 :(得分:3)

外连接表的标准属于ON子句:

SELECT 
  Inventory.SKU, 
  Sum(Sales.[Sales $]), 
  Inventory.Qty, 
  Sum(Sales.[Qty Ordered])
FROM (Inventory 
LEFT JOIN Sales ON Inventory.SKU = Sales.[Style Id]
                AND Sales.[Order date] Between #5/14/2016# And #5/22/2016#)
GROUP BY Inventory.SKU, Inventory.Qty;

原因是外连接意味着在没有记录匹配的情况下连接填充了NULL的虚拟记录。但是如果列为NULL,则WHERE条件对于这些记录永远不会成立,并且您就可以使用简单的INNER JOIN

答案 1 :(得分:1)

您所要做的就是将where子句的内容移动到on子句:

SELECT Inventory.SKU, Sum([Sales].[Sales $]), Inventory.Qty, Sum([Sales].Qty Ordered)
FROM Inventory 
LEFT JOIN Sales ON  ((Inventory.SKU = [Sales].[Style Id]) 
                AND (([Sales].[Order date] Between #5/14/2016# And #5/22/2016#)))
GROUP BY Inventory.SKU, Inventory.Qty;