Я предполагаю, что это связана с тем, что вы выполняете неявный cross joins с внутренним подзапросом. Хотя некоторые SQL-модули автоматически оптимизируют эти типы запросов, MS Access не является одним из них.
Перекрестное соединение возвращает декартово произведение двух таблиц; Декартово произведение представляет собой комбинацию каждой строки из одной таблицы в сочетании с каждой строкой из другой таблицы. Поэтому, если таблица1 имеет 1000 строк, а таблица2 имеет 1000 строк, то декартово произведение этих таблиц имеет 1000 х 1000 = 1 000 000 строк.
Ситуация ухудшается, когда вы добавляете таблицы. Если ваша таблица3 содержит 10 000 строк, то декартово произведение всех трех таблиц составляет 1000 x 1000 x 10,0000 = 10 000 000 000 строк. Вы можете увидеть, как объединение таблиц с минимальным размером может быстро перегрузить системные ресурсы и привести к ошибке переполнения.
Когда вы делаете INNER JOIN, результирующий набор строк является пересечением таблиц, в которых выполняется указанное условие JOIN. Это (почти *) всегда приводит к меньшему результирующему набору, чем CROSS JOIN.
Вместо этого вы должны использовать INNER JOINs. Попробуйте следующее:
SELECT max(v_difference) AS max_v_difference
FROM
(
SELECT vv1 - vv2 AS v_difference
FROM
(
SELECT t1.v1 AS vv1, t2.v1 AS vv2
FROM (table1 AS t1 INNER JOIN table2 AS t2 ON t1.id = t2.id)
INNER JOIN table3 AS t3 ON t1.id = t3.id
WHERE t1.ID <> ""
)
)
* Можно указать условие соединения, которое всегда будет оценивать ИСТИНУ для каждой комбинации строк. В таком случае результат INNER JOIN будет таким же, как и CROSS JOIN. Конечно, такой запрос не имел бы реальной ценности, кроме как дискредитировать объяснения, которые используют безоговорочно абсолютный язык, например, «always»;).
Почему нет JOIN между таблицей 1, table2 и table3? – PaulFrancis