2016-10-25 2 views
0

У меня есть рабочий запрос, который слишком долго выполняется. Он используется для заполнения поля формы доступа списком различных контрактов, упорядоченных по дате начала.MS Access - проблемы с использованием переменных в выражении WHERE

Следующий запрос возвращает список отдельных дат начала контракта для нескольких товаров (в которых указаны даты начала контракта), где дата начала контракта (DELSTART) больше или равна текущей дате (PRICEDATE).

Функция returndelivery возвращает атрибут даты контракта, преобразованный в double, функция returnnumericdate возвращает двойное значение с даты (yyyymmdd).

SELECT DISTINCT (tblFuturesPrices.Period), 
     returnnumericdate(returndelivery([PERIOD],"S")) AS DELSTART, 
     ReturnNumericDate(Date()) AS PRICEDATE 
FROM tblFuturesPrices 
WHERE returnnumericdate(returndelivery([PERIOD],"S")) >= ReturnNumericDate(Date()) 
GROUP BY PERIOD 
ORDER BY returnnumericdate(returndelivery([PERIOD],"S")); 

В идеале я хотел бы обратиться к DELSTART переменных и PRICEDATE в ИНЕКЕ, но Access запрашивает значение переменной, когда я делаю так. Я думаю, что запрос занимает больше времени, чем нужно, потому что мне приходится многократно использовать свои пользовательские функции.

Исходная таблица (tblFutures) содержит цены на каждый товар/контракт на рабочие дни, возвращающиеся на 6 месяцев.

Заранее спасибо.

+0

Является ли оптимизатор достаточно умен, чтобы заметить, что три повторения «returnnumericdate» (returndelivery ([PERIOD], «S»)) нужно оценивать только один раз или это поможет вставить это в производную таблицу или «VIEW»? – onedaywhen

+0

Я думаю, что я мог бы заполнить временную таблицу, которая обновляется только при загрузке формы и изменении дня. Я надеялся, что объявление DELSTART будет содержать значения таблиц, а ссылки на них позже будут быстрее. – GazG

ответ

0

Я думаю, что запрос занимает больше времени, чем нужно, потому что мне нужно использовать мои пользовательские функции много раз.

Всё. Но вы можете уменьшить эти функции:

returnnumericdate(returndelivery([PERIOD],"S")) >= ReturnNumericDate(Date()) 

не будет отличаться от

returndelivery([PERIOD],"S") >= Date() 

Не знаю, что returndelivery делает.

Добавление:

фильтр на основе необработанных данных и создать новую функцию returndeliverydate, что делает то же самое, как returndelivery за исключением возвращает значение даты:

SELECT 
    tblFuturesPrices.Period, 
    returndeliverydate([PERIOD],"S") AS DELSTART, 
    Date() AS PRICEDATE 
FROM 
    tblFuturesPrices 
WHERE 
    returndeliverydate([PERIOD],"S") >= Date() 

Сохранить этот запрос и используйте его как источник в новом запросе:

Select Distinct 
    DELSTART, 
    PRICEDATE 
FROM 
    YourQuery 
+0

Спасибо за ваш комментарий, returndelivery принимает ряд имен поставки контракта, например. Nov16, Q1 17, Sum18 и возвращает дату начала контракта как двойную. Доступ настолько противен датам, которые я сдавал, так например returndelivery ('Nov16', 'S') даст вам 20161101. – GazG

+0

Я вижу. Но даты не «противны», ни что-то волшебное, просто подтип Double. Использование чего-либо другого, кроме даты, когда дело касается даты и времени, вызовет больше проблем, чем правильное. См. Добавление. – Gustav

+0

Спасибо Густав.Я почти завершил переход на ежедневную нагрузку на полосы в таблице темп, но посмотрю на ваше предложение относительно новой функции. – GazG

Смежные вопросы