带有where子句的SQL Left外连接减少了左外连接

时间:2016-07-23 23:26:59

标签: sql sql-server

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

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子句只返回具有值的状态,而不是返回所有值。

1 个答案:

答案 0 :(得分:2)

假设您仍想要返回所有状态,并且AreaId位于SecretProcesses表中,则需要将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