【问题标题】:SQL Left Outer join with where clause reduces results from left outer join带有 where 子句的 SQL 左外连接减少左外连接的结果
【发布时间】:2016-07-23 23:26:59
【问题描述】:

我有以下查询完全符合我的预期。它返回所有带有计数的状态。

SELECT 
    ProcessStatuses.Status, 
    COUNT(SecretProcesses.ProcessStatusID) AS Count
FROM  
    ProcessStatuses
LEFT OUTER JOIN 
    SecretProcesses ON ProcessStatuses.ProcessStatusID = SecretProcesses.ProcessStatusID
GROUP BY 
    ProcessStatuses.Status

结果:

Status  Count
-------------
status1 0
status2 0
status3 0
status4 0
status5 0
status6 1
status7 0
status8 0

但是,如果我在查询中添加 WHERE 子句,它只会返回具有计数的状态。

例如

SELECT 
    ProcessStatuses.Status, 
    COUNT(SecretProcesses.ProcessStatusID) AS Count
FROM 
    ProcessStatuses
LEFT OUTER JOIN 
    SecretProcesses ON ProcessStatuses.ProcessStatusID = SecretProcesses.ProcessStatusID
WHERE 
    AreaID IN (21, 22, 23)
GROUP BY 
    ProcessStatuses.Status

结果:

Status  Count
---------------
status6 1

这种方式违背了进行左外连接的目的,因为我希望能够按它们所在的区域过滤结果,同时仍然显示所有可能的状态。 where 子句只返回有值的状态,而不是所有值。

【问题讨论】:

  • 如果使用 Count(1) 或代替 Count(SecretProcesses.ProcessStatusId) 会发生什么。

标签: sql sql-server


【解决方案1】:

假设您仍想返回所有状态并且AreaIdSecretProcesses 表中,您需要将where 条件移动到on 条件,因为它否定了您的outer join

SELECT PS.Status, COUNT(SPProcessStatusID) AS Count
FROM ProcessStatuses PS
    LEFT JOIN SecretProcesses SP ON PS.ProcessStatusID = SP.ProcessStatusID 
        AND SP.AreaID IN (21, 22, 23)
GROUP BY PS.Status

【讨论】:

  • 感谢这工作完美,现在我正在看更多的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多