2016-11-04 108 views
0

我有以下查詢:零,如果沒有返回值

SELECT 
    f.name, 
    COUNT(distinct(p.id)) 
FROM 
    problems p INNER JOIN problem_list pl on p.problem_list_id = pl.id 
    FULL OUTER JOIN facilities f on f.id = p.facility 
WHERE 
    p.problem_list_id = '100' 
    AND f.name in ('CRJ','TVRJ','WRJ') 
GROUP BY 
    f.name 
ORDER BY 
    f.name 

當這個查詢運行,有時facilities的一個不返回結果。在這種情況下,我還是喜歡我的結果集顯示設備,而是返回一個0

例如:

CRJ  |   0| 
TVRJ  |   12| 
WRJ  |   2| 

我試着使用​​3210,調整我的加入facility表,但它似乎並沒有工作。

+0

的可能的複製[如何包括 「零」/ 「0」 COUNT彙總結果?](http://stackoverflow.com/questions/14793057/how-to-include-zero-0-results -in-count-aggregate) –

回答

3

我不認爲一個FULL JOIN是需要的,只是一個LEFT JOIN

SELECT 
    f.name, 
    ISNULL(COUNT(DISTINCT p.id),0) N 
FROM 
    facilities f 
    LEFT JOIN (SELECT * 
       FROM problems 
       WHERE problem_list_id = '100') p 
     ON f.id = p.facility 
    LEFT JOIN problem_list pl 
     ON p.problem_list_id = pl.id 
WHERE 
    f.name in ('CRJ','TVRJ','WRJ') 
GROUP BY 
    f.name 
ORDER BY 
    f.name; 
+0

爲什麼需要嵌入式查詢? –

+2

@FrumRoll與將該過濾器用作連接條件完全相同。我更喜歡這種寫法,因爲它對我來說更清楚我正在過濾一些行 – Lamak

1

原始查詢開始的問題,如果要包括已沒有你可能要啓動困難設施與設施。

SELECT f.name, ISNULL(COUNT(DISTINCT p.id), 0) 
FROM facilities f 
LEFT JOIN problems p ON p.facility = f.id AND p.problem_list_id = '100' 
LEFT JOIN problem_list pl ON pl.id = p.problem_list_id 
WHERE f.name in ('CRJ', 'TVRJ', 'WRJ') 
GROUP BY f.name 
ORDER BY f.name