sql - 获取多个表的最大值
问题描述
在我的 SQLite 数据库中,每个表中都有一sync_id
列。我经常想检索sync_id
每个表的最大值。这是我首先尝试的:
SELECT
MAX(answer.sync_id),
MAX(community.sync_id),
MAX(question.sync_id),
MAX(topic.sync_id)
FROM
answer,
community,
question,
topic;
这个查询花了很长时间,我实际上从未完成它。
这是我接下来尝试的:
SELECT "answer" AS name, MAX(answer.sync_id) AS max_sync_id FROM answer
UNION SELECT "community" AS name, MAX(community.sync_id) AS max_sync_id FROM community
UNION SELECT "question" AS name, MAX(question.sync_id) AS max_sync_id FROM question
UNION SELECT "topic" AS name, MAX(topic.sync_id) AS max_sync_id FROM topic;
这个速度非常快,给了我预期的结果。
我对此有两个问题:
- 为什么这两个查询如此不同?我猜有一些我没有得到的 SQL 语义,某种隐式 JOIN ......
- 第一个查询将最大值作为一行返回,列以表命名。第二个查询每行最多返回 1 个,我必须创建一个
name
列来保留上下文。有没有办法以第二个查询的速度获得第一个查询的结果集?
解决方案
1/ 为什么查询如此不同
因为第一个在对它运行之前将一个大表作为 4 个表的笛卡尔积select
,而第二个在将结果聚合为 4 行之前每个表触发 1 个请求。两个请求的执行计划都可以详细说明。
2/ 有没有办法以第二次查询的速度获得第一次查询的结果集?
不,这是因为您的数据的性质:似乎您的 4 个表无论如何都不相关,因此您不能有一个(快速)请求来全部命中它们。最好的方法可能是发出 4 个请求,并将结果分组到您的应用程序中。
推荐阅读
- python-import - 使用“导入”与“从 X 导入”
- excel - 循环遍历重复代码
- c++ - 介子和本征的文件路径问题
- biztalk - JSON解码器:对象引用未设置为对象的实例
- mysql - 如何在日期字段中使用案例
- ios - iOS应用全屏问题
- javascript - firesore 上的 on.(child_added) 等价物是什么?
- swift - 当视图在 UIKit (swift 4) 中保持动画时,我如何与视图交互?
- javascript - Reducer 更新了错误的值(数组更新了一个项目,里面的项目很少,而不是分散它们)
- wpf - 任务状态区域中的多个 NotifyIcon 图像