10

我有以下选择语句,我需要对表 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 和 0 或 NULL 的 totalTime)。因此,为了正确加入表 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 语法错误。我究竟做错了什么?有没有更好的方法来实现我的目标?

4

1 回答 1

19

即使 SQLite没有实现 RIGHT OUTERor 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将null 替换为.totalTimeCOALESCE()0

于 2012-02-05T05:23:19.680 回答