2014-10-16 4 views
0

Мне нужно найти максимальное значение столбца таблицы MS Access по sql-запросу.ошибка переполнения sql-запроса в MS Access

SELECT max(v_difference) AS max_v_difference 
FROM 
(
    SELECT *, vv1 - vv2 AS v_difference , 
    FROM 
    (
    SELECT table3.* , table1.v1 AS vv1, table2.v1 AS vv2 
    FROM table1, table2, table3 
    where table1.id = table2.id and table1.id <> "" and table3.id = table1.id 
) 
) 

Я получил сообщение об ошибке: "переполнение"

Любая помощь будет оценена.

благодаря

+0

Почему нет JOIN между таблицей 1, table2 и table3? – PaulFrancis

ответ

1

Я предполагаю, что это связана с тем, что вы выполняете неявный 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»;).