2016-07-23 113 views
1

我有以下查詢,完全按照我期望的方式工作。它用計數返回所有狀態。SQL左外部連接使用where子句減少了左外部連接的結果

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

如果你使用會發生什麼計數(1)或而不是計數(SecretProcesses.ProcessStatusId)。 –

回答

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 
+1

感謝這工作完美,現在我正在看它更有意義。 – Derked