SQL查询中的LEFT JOIN

4

好的...在SQL中,我总是对LEFT JOIN感到困惑。

我有一个简单的查询:

SELECT COUNT(*) as OpenedToday, c.Product_Line, c.Product_Code
FROM SFCase as c
LEFT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p ON p.Product_Code = c.Product_Code
WHERE IsClosed = 'false'
AND DATEPART(YEAR, GETDATE()) = DATEPART(YEAR, CreatedDate)
AND DATEPART(MONTH, GETDATE()) = DATEPART(MONTH, CreatedDate)
AND DATEPART(DAY, GETDATE()) = DATEPART(DAY, CreatedDate)
GROUP BY c.Product_Line, c.Product_Code

我期望得到的是所有Product_Code清单,包括今天打开的案例数量(包括零值)。但实际上,我只得到了今天打开案例的产品代码列表(只有正值)。
当我运行DISTINCT Product_Code时,有70个结果显示。然而,运行完整查询,我今天只得到4个结果。我希望看到所有70个结果,如果今天没有打开案例,则显示零值。
这个join有什么问题吗?
查理

1
SFCase只保存今天打开的案例吗?如果不是,那么如何确定哪些案例是今天打开的 - 例如是否有opened_date?您是否有一个单独的表来保存所有产品? - user359040
你所做的是相反的。请使用正确的外连接。 - chetan
马克 - 实际上,我的真正查询有点复杂... 我试图简化它以适应论坛。我已经更新了问题以显示完整的查询... 我只是检查CreatedDate字段以确定它是否在今天打开。 - Charlie74
2个回答

2

尝试:

SELECT SUM(CASE WHEN IsClosed='false' AND DATEDIFF(DAY, GETDATE(), CreatedDate)=0 
                THEN 1 ELSE 0 END) as OpenedToday, 
       Product_Line, Product_Code
FROM SFCase
GROUP BY Product_Line, Product_Code

很好,谢谢Mark。这就解决了问题。我需要一分钟来理解它...这绝对是一个不同的方法,但似乎正好给了我我想要的东西。非常感谢! - Charlie74
好的...阅读完那个CASE语句之后...这很有道理。我喜欢这种方法...实际上,我认为它可能会帮助我处理一些我继承的其他查询。我也许能够简化它们,以便我可以真正管理它们哈哈。 - Charlie74

1
SELECT  p.Product_Line, p.Product_Code,COUNT(*) as OpenedToday
FROM SFCase as c
RIGHT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p 
ON p.Product_Code = c.Product_Code
GROUP BY p.Product_Line, p.Product_Code

不幸的是,这给出了与我之前相同的结果。 - Charlie74

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接