我有以下选择语句,在这里我需要对表tbTasks中的每个任务求和,并按表tbProjects中的projectId对其进行分组,以获得类似这样的记录:
ProjectID = 1, ProjectName = 'My Project', TotalTime = 300 //<--sum of each task time
查询如下所示:
SELECT tbTasks.projectId,
SUM(tbTasks.taskTime) AS totalTime,
tbProjects.projectName
FROM tbTasks
INNER JOIN tbProjects ON tbTasks.projectId = tbProjects.projectId
GROUP BY tbTasks.projectId
ORDER BY tbProjects.created DESC
这可以正常工作并执行,但是有一个问题,如果一个项目没有与之关联的任务,那么我根本就没有任何记录(我想在其中获得projectId,projectName和totalTime的值为0或NULL)。因此,为了正确连接表tbProjects,SQLite3迫使我以一种绕行方式进行操作。
SELECT tbTasks.projectId,
SUM(tbTasks.taskTime) AS totalTime,
tbProjects.projectName
FROM tbTasks LEFT OUTER JOIN tbProjects
ON tbTasks.projectId = tbProjects.projectId
GROUP BY tbTasks.projectId
UNION
SELECT tbProjects.projectId,
SUM(tbTasks.taskTime) AS totalTime,
tbProjects.projectName
FROM tbProjects LEFT OUTER JOIN tbTasks
ON tbProjects.projectId = tbTasks.projectId
GROUP BY tbTasks.projectId
ORDER BY tbProjects.created DESC
只是这不起作用,我得到一个SQL语法错误。我究竟做错了什么?有没有更好的方法可以实现我的目标?
最佳答案
即使使用SQLite hasn't implemented RIGHT OUTER
或FULL OUTER
,它也会使具有LEFT OUTER JOIN
,这应该可以满足您的要求。只需在左边添加tbProjects
。
SELECT tbProjects.projectId,
COALESCE(SUM(tbTasks.taskTime), 0) AS totalTime,
tbProjects.projectName
FROM tbProjects
LEFT OUTER JOIN tbTasks ON tbProjects.projectId = tbTasks.projectId
GROUP BY tbProjects.projectId
ORDER BY tbProjects.created DESC
对于没有任何任务的项目,您会在
NULLS
中获得totalTime
,并且对 COALESCE()
的调用将NULL替换为0
。