Оптимизировать вычисления в запросе

Дмитрий П.
Дата: 24.02.2016 21:58:35
Здравствуйте!

Access 2003: В конструкторе я создал запрос для вычисления значения Y как функции от полей X1 и Х2 в таблице myTable.
Но я хочу чтобы запрос выдавал только значения Y больше 1 и причем в отсортированном виде.

Когда я перешел в Режим SQL то получил:

SELECT X1, X2, (X1 + X2)/2 as Y FROM myTable WHERE (X1 + X2)/2 > 1 ORDER BY (X1 + X2)/2;

Подозреваю, что для исполнения такого запроса, для каждой строки из myTable Access 3 раза вычисляет (X1+X2)/2
Как заставить Access 2003 делать одно вычисление и использовать его результат и для SELECT и для WHERE и для ORDER BY

Спасибо
sdku
Дата: 24.02.2016 23:25:51
Дмитрий П.,
А зачем ??? (чё очень долго,порядка 2 минут,работает)
\\\\
Дата: 25.02.2016 05:51:45
Дмитрий П.,
SELECT * FROM (SELECT X1, X2, (X1 + X2)/2 as Y FROM myTable) As qsel  WHERE qsel.Y > 1 ORDER BY qsel.Y;
__Michelle
Дата: 25.02.2016 09:40:03
\\\\
Дмитрий П.,
SELECT * FROM (SELECT X1, X2, (X1 + X2)/2 as Y FROM myTable) As qsel  WHERE qsel.Y > 1 ORDER BY qsel.Y;
Вот я тоже так подумала.
Но решила проверить.
Взяла таблицу с одной записью
AB
2030
Два запроса
1.
SELECT A,B,FuncF(A,B) FROM Таблица1 WHERE FuncF(A,B)>0 ORDER BY FuncF(A,B);
2.
SELECT * FROM (SELECT A,B,FuncF(A,B) AS C FROM Таблица1) AS T WHERE C>0 ORDER BY C;
Функция
Function FuncF(A, B) As Integer
 Debug.Print A & "," & B
 FuncF = 1
End Function
Получилось по Debug.Print, что для обоих запросов обращение к функции происходит трижды (при одной записи в таблице).
20,30
20,30
20,30

20,30
20,30
20,30
Если же записей в таблице две, то обращений к функции и в одном, и в другом запросе - семь.
20,30
20,30
40,50
40,50
40,50
20,30
40,50

20,30
20,30
40,50
40,50
40,50
20,30
40,50
Если записей в таблице три, то получилось по девять обращений к функции
20,30
20,30
40,50
40,50
60,70
60,70
60,70
40,50
20,30

20,30
20,30
40,50
40,50
60,70
60,70
60,70
40,50
20,30
В общем, у меня получается, что количество обращений из обоих запросов одинаково.
Посмотрите, пожалуйста, есть ли ошибка в моих "изысканиях"?
Vladimir Baskakov
Дата: 25.02.2016 10:25:13
добавить в таблицу колонку и пересчитывать ее при необходимости?
Vladimir Baskakov
Дата: 25.02.2016 10:30:19
в конце концов - были вычислимые поля. они скорее всего много раз пересчитываться не станут.
https://support.office.com/ru-ru/article/Добавление-вычисляемого-поля-в-таблицу-14a60733-2580-48c2-b402-6de54fafbde3
sdku
Дата: 25.02.2016 11:03:45
Да, можно порыться в литературе, но лень и узнать КАК выполняется запрос SQL на более низком уровне-сдается мне,что программисты не идиёты и вычисления выполняются без многократных пересчетов
__Michelle
Дата: 25.02.2016 11:07:13
sdku
Да, можно порыться в литературе, но лень и узнать КАК выполняется запрос SQL на более низком уровне-сдается мне,что программисты не идиёты и вычисления выполняются без многократных пересчетов
Как же так?
Эксперимент же показал n-кратное обращение к функции, это и есть многократные пересчеты.
Нет разве?
Predeclared
Дата: 25.02.2016 11:19:39
__Michelle
... Эксперимент же показал ...

Эксперимент показал, что в случае пользования VBA функции...
Для случая НЕ пользования VBA функции он ничего НЕ показал.
:)
__Michelle
Дата: 25.02.2016 11:26:37
Predeclared
__Michelle
... Эксперимент же показал ...

Эксперимент показал, что в случае пользования VBA функции...
Для случая НЕ пользования VBA функции он ничего НЕ показал.
:)
Вычисление выражения с функцией или без функции - все равно вычисление выражения.
Применение функции просто позволяет это отследить.
А как отследить вычисление выражения без функции? Я не знаю.
Если знаете способ, подскажите, пожалуйста.
Может, и обнаружится искомая разница в подходах.