【发布时间】:2016-10-25 23:34:36
【问题描述】:
我有一个工作查询需要很长时间才能运行。它用于填充 Access 表单字段,其中包含按开始日期排序的不同合同列表。
以下查询返回多个商品(共享合约开始日期)的不同合约开始日期列表,其中合约开始日期 (DELSTART) 大于或等于当前日期 (PRICEDATE)。
函数returndelivery返回一个转换为双精度的合约的日期属性,函数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"));
理想情况下,我想在 where 子句中引用变量 DELSTART 和 PRICEDATE,但当我这样做时,Access 会提示输入变量值。我认为查询花费的时间比它应该的要长,因为我不得不多次使用我的用户定义函数。
源表 (tblFutures) 包含过去 6 个月的工作日内每种商品/合约的价格。
提前致谢。
【问题讨论】:
-
优化器是否足够聪明,可以注意到
returnnumericdate(returndelivery([PERIOD],"S"))的三个重复只需要评估一次,或者将其推入派生表或VIEW是否有帮助? -
我在想我可以填充一个临时表,该表仅在表单加载并且日期发生变化时才更新。我希望 DELSTART 声明将保存表值,并且稍后引用它们会更快。