Получить максимальное значение для нескольких таблиц - PullRequest
0 голосов
/ 13 ноября 2018

В моей базе данных 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-й запрос возвращает максимумы в виде одной строки со столбцами, названными в честь таблиц.Второй запрос возвращает максимум 1 на строку, и мне пришлось создать столбец name, чтобы сохранить контекст.Есть ли способ получить набор результатов 1-го запроса со скоростью 2-го запроса?

1 Ответ

0 голосов
/ 13 ноября 2018

1 / Почему запросы так различны

Поскольку первый из них создает большую таблицу как декартово произведение четырех таблиц, а затем запускает против нее select, а второй запускает 1 запрос натаблица перед агрегированием результатов в 4 строки.План выполнения обоих запросов может показать это в деталях.

2 / Есть ли способ получить набор результатов 1-го запроса со скоростью 2-го запроса?

Нет.Это связано с природой ваших данных: кажется, что ваши 4 таблицы в любом случае не связаны, поэтому у вас не может быть одного (быстрого) запроса, чтобы поразить их все.Лучше всего сделать 4 запроса и сгруппировать результаты в приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...