[英]SQLite3 Simulate RIGHT OUTER JOIN with LEFT JOINs and UNION
我有以下select語句,我需要從表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語法錯誤。 我究竟做錯了什么? 有沒有更好的方法來實現我的目標?
盡管SQLite 沒有實現 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
對於沒有任何任務的項目,您在totalTime
獲得NULLS
,並且對COALESCE()
的調用將null替換為0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.