一个看起来非常简单的问题,但不知何故不适用于我在 Oracle 10gXE 上。
根据我的 SQLFiddle,我必须显示所有员工姓名并计数(如果存在)或 0 如果没有找到状态 = 2 的记录
如何在单个查询中实现它而不在我的应用程序端调用 Loop。
一个看起来非常简单的问题,但不知何故不适用于我在 Oracle 10gXE 上。
根据我的 SQLFiddle,我必须显示所有员工姓名并计数(如果存在)或 0 如果没有找到状态 = 2 的记录
如何在单个查询中实现它而不在我的应用程序端调用 Loop。
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
行被过滤掉。
请注意,这在这里并不是一个真正有用的列,因为除了or之外,您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
我更正了你的 sqlfiddle:http ://sqlfiddle.com/#!4/90ba0/12
经验法则是过滤器必须出现在它们所依赖的表的 ON 条件中。
将过滤器移动到 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