2

一个看起来非常简单的问题,但不知何故不适用于我在 Oracle 10gXE 上。

根据我的 SQLFiddle,我必须显示所有员工姓名并计数(如果存在)或 0 如果没有找到状态 = 2 的记录

如何在单个查询中实现它而不在我的应用程序端调用 Loop。

4

3 回答 3

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行被过滤掉。

请注意,这在这里并不是一个真正有用的列,因为除了or之外,您STATUS永远不会得到任何结果,因此您可以省略它:2NULL

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
于 2013-05-20T18:40:53.593 回答
2

我更正了你的 sqlfiddle:http ://sqlfiddle.com/#!4/90ba0/12

经验法则是过滤器必须出现在它们所依赖的表的 ON 条件中。

于 2013-05-20T18:43:18.250 回答
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
于 2013-05-20T18:44:29.280 回答