10

次の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

これは正常に機能して実行されますが、1つの問題として、プロジェクトにタスクが関連付けられていない場合、レコードがまったく返されません(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構文エラーが発生します。私は何が間違っているのですか?私の目標を達成するためのより良い方法はありますか?

4

1 に答える 1

19

SQLiteは実装していませんが、またはを実装 しています。これにより、必要な処理を実行できます。左側にいるだけです。RIGHT OUTERFULL OUTERLEFT OUTER JOINtbProjects

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を.に置き換えるためtotalTimeの呼び出し。COALESCE()0

于 2012-02-05T05:23:19.680 に答える