获得多个表的最大值

时间:2018-11-13 15:09:26

标签: sql sqlite

在我的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;

这非常快,给了我预期的结果。


我对此有2个问题:

  • 两个查询为什么如此不同?我猜有一些我没有得到的SQL语义,某种隐式的JOIN ...
  • 第一个查询将最大值作为一行返回,并以表命名。第二个查询每行最多返回1,我必须创建一个name列以保留上下文。有没有办法以第二查询的速度获取第一查询的结果集?

1 个答案:

答案 0 :(得分:1)

1 /为什么查询如此不同

因为第一个在对它运行select之前将一个大表作为4个表的笛卡尔积,而第二个对每个表激发1个请求,然后将结果汇总为4行。这两个请求的执行计划都可以详细显示。

2 /有没有办法以第二查询的速度来获取第一查询的结果集?

不。这是因为您的数据的性质:看来您的4个表无论如何都不相关,因此您不能有一个(快速)请求就可以全部击中它们。最好的办法可能是发出4个请求,然后将结果分组到您的应用程序中。