我有以下查询,它完全符合我的预期。它返回带有计数的所有状态。
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子句只返回具有值的状态,而不是返回所有值。
答案 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