我有以下选择语句,在这里我需要对表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 OUTERFULL 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

10-07 12:38
查看更多