簡體   English   中英

SQLite3使用LEFT JOIN和UNION模擬RIGHT OUTER JOIN

[英]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 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

對於沒有任何任務的項目,您在totalTime獲得NULLS ,並且對COALESCE()的調用將null替換為0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM