【问题标题】:SQL where clause not returning rows where count equals zeroSQL where 子句不返回计数为零的行
【发布时间】:2020-08-17 15:04:39
【问题描述】:

此查询的目标是选择我们数据库中的每个工作订单模板,并对状态未关闭的每个现有工作订单进行计数。我正在使用左连接。左表是工单模板表。右表是工作订单表,其中包含我们数据库中的每个工作订单。

SELECT      A.DESCRIPTION AS WO_TEMPLATE, COUNT(B.WORKORDERID) AS NUM_OF_WOS
FROM        WOTEMPLATE AS A
LEFT JOIN   WORKORDER AS B
ON          A.WOTEMPLATEID = B.WOTEMPLATEID
WHERE       B.STATUS != 'CLOSED'
GROUP BY    A.DESCRIPTION
ORDER BY    WO_TEMPLATE;

我们的数据库有 386 个工单模板...因此应返回 386 行。我的问题是当我包含 WHERE 子句时,只返回 286 行,因为没有返回没有关联工作单的工作单模板。

给定 JOIN、GROUP BY 和 WHERE 子句,我如何返回 count = 0 的行?

使用 Microsoft SQL Server Express

【问题讨论】:

  • 我只是想补充您的格式。非常舒缓。做得好。看来你上过我的课了。
  • 跳过 WHERE 子句。使用 case 表达式进行条件聚合。
  • 我认为唯一的问题是WHERE 子句将此连接变为内部连接,因为在外部连接行中 B.STATUS 为空。将WHERE 更改为AND。应该是这样的。
  • @ThorstenKettner 这是可视化 WHERE 子句的作用的好方法。我可能会偷那个。

标签: sql sql-server


【解决方案1】:

WHERE 子句将此连接转换为内连接,因为在外连接行中 B.STATUS 为空。

WHERE 更改为AND,以便将状态列上的过滤器移动到外部连接的连接条件:

SELECT      A.DESCRIPTION AS WO_TEMPLATE, COUNT(B.WORKORDERID) AS NUM_OF_WOS
FROM        WOTEMPLATE AS A
LEFT JOIN   WORKORDER AS B
ON          A.WOTEMPLATEID = B.WOTEMPLATEID
AND         B.STATUS != 'CLOSED'
GROUP BY    A.DESCRIPTION
ORDER BY    WO_TEMPLATE;

【讨论】:

  • 那么为什么你需要同时发表评论和答案呢?虽然您的方向可能适用于这种特殊情况,但总体思路最好表述为“将过滤条件从 where 子句移动到连接”。
  • @SMor:我发布了该评论,然后我认为我最好将其发布为答案,因为这样它就可以被接受并且答案对于未来的读者来说是显而易见的。然后我看了看,对评论有反应,所以我让它站着。我不明白为什么将其表述为“将过滤条件从 where 子句移动到连接”会更好。在这里将WHERE 更改为AND 是不是很明显? ...好吧,也许你有一个观点,有人可能会忽略这一点。我会相应地编辑我的答案。
  • @ThorstenKettner 感谢您的详细说明!
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多