当前位置: 首页 > 面试题库 >

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

祁承嗣
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 我有以下要模拟的Logger,但要验证是否正在调用日志条目,而不是内容。 我想模拟用于LoggerFactory.getLogger()的任何类,但是我找不到如何做到这一点。到目前为止,这是我最终得到的结果: 我想知道: 我可以模拟静态模型以用于任何课程吗? 我只能似乎运行的,因此我似乎无法改变每个方法的特点。有没有解决的办法? 编辑结果: 我以为我已经尝试过了,但没有成功: 但是,谢

  • 9.4.1.2.使用 sqlite3 Android 附带了一个命令行工具sqlite3,供我们访问数据库。 要验证数据库原型是否正确,你需要: 打开终端或者命令提示符。 输入adb shell,连接到仿真器或者真机。 切换到数据库所在的目录:cd/data/data/com.marakana.yamba/databases/。 通过sqlite3timeline.db打开数据库。 打开数据库之后

  • 出于学校目的,我正在创建一个使用股票API的应用程序。 我正在尝试为一种获取过去10年所有股票数据的方法编写一个测试。我不想实际获取所有这些数据,而是想抛出一个异常。 我想测试的方法: 股票时间系列(....)调用可以抛出阿尔法仓位异常。 我这样嘲弄了TimeSeries类: 在我的测试类中,我想模拟这个调用,并返回一个异常而不是实际数据。 无论我多么试图嘲笑这段代码,它永远不会抛出异常。它将始终

  • 问题内容: 我正在尝试使用富有想象力的Mock测试库测试Django应用程序时模拟某些东西。我似乎无法完全正常工作,我正在尝试这样做: 我究竟做错了什么? 问题答案: 啊,我对在哪里应用该补丁装饰感到困惑。固定:

  • 问题内容: 和之间有什么区别? 问题答案: 删除重复的记录(结果中的所有列均相同),但不删除。 使用而不是时,性能会受到影响,因为数据库服务器必须做额外的工作才能删除重复的行,但是通常您不希望重复(特别是在开发报表时)。 UNION示例: 结果: UNION ALL示例: 结果:

  • 在安装到AEM 5.6.1实例之前,我正在使用maven构建和测试我的代码。我已经编写了单元测试,这些测试使用wcm的实现从aem模拟中获益。io和其他需要使用powermockito模拟静态方法的单元测试。 以下是我对aem上下文、sling Mock和powermock的maven依赖关系。 在我的课堂上,我正在为aem上下文设置规则,并准备一些用于模拟的静态类: 当我通过命令行运行mvn测试