2016-11-04 86 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