一个非常简单的问题,因为它出现但在Oracle 10gXE上以某种方式不适合我。
基于my SQLFiddle,我必须显示所有员工姓名和计数(如果存在)或0如果没有找到状态= 2的记录
如何在单个查询中实现它而不在我的应用程序端调用Loop。
答案 0 :(得分:5)
SELECT S.NAME,ISTATUS.STATUS,COUNT(ISTATUS.Q_ID) as TOTAL
FROM STAFF S
LEFT OUTER JOIN QUESTION_STATUS ISTATUS
ON S.ID = ISTATUS.DONE_BY
AND ISTATUS.STATUS = 2 <--- instead of WHERE
GROUP BY S.NAME,ISTATUS.STATUS
通过在WHERE
子句中进行过滤,过滤得太晚,并删除了您想要查看的STAFF
行。将过滤器移动到连接条件意味着只过滤掉QUESTION_STATUS
行。
请注意,此处STATUS
并不是真正有用的专栏,因为除了2
或NULL
之外,您不会得到任何其他结果,因此您可以省略它:
SELECT S.NAME,COUNT(ISTATUS.Q_ID) as TOTAL
FROM STAFF S
LEFT OUTER JOIN QUESTION_STATUS ISTATUS
ON S.ID = ISTATUS.DONE_BY
AND ISTATUS.STATUS = 2
GROUP BY S.NAME
答案 1 :(得分:2)
我更正了你的sqlfiddle:http://sqlfiddle.com/#!4/90ba0/12
经验法则是过滤器必须出现在它们所依赖的表的ON状态中。
答案 2 :(得分:1)
将过滤器移动到LEFT JOIN中,同时使用COALESCE使结果显示0而不是您在问题中请求的null
select S.NAME,COALESCE(ISTATUS.STATUS,0),COUNT(ISTATUS.Q_ID) as TOTAL
from STAFF S
LEFT OUTER JOIN QUESTION_STATUS ISTATUS
ON S.ID = ISTATUS.DONE_BY
AND ISTATUS.STATUS =2
GROUP BY S.NAME,ISTATUS.STATUS