优化迭代两个不同数据表的VBA过程

时间:2015-06-02 19:34:29

标签: sql vba ms-access ms-access-2003

我有两个false sql tablespricetbl。由于物品价格每天都在变化,我需要用适当时间的价格更新paymenttbl。如果在产品价格paymenttbl之后进行交易,那么date-effective中的交易价格与最新产品的价格相同(只要日期相同) - 有效期小于交易日期)。我不想仅仅限制自己,我想迭代整个表格来更改数据,这样每笔交易都有适当的价格。

paymenttbl

运行查询后的预期表PriceTbl pID| Price| Date Effective --------------------------- 1 | 10 | 01-12-2014 2 | 20 | 01-02-2015 3 | 20 | 02-12-2014 2 | 40 | 20-03-2015 1 | 50 | 02-03-2015 4 | 34 | 20-02-2015 1 | 40 | 25-05-2015 PaymentTbl payID | pID | transDate | Price -------------------------------- 1 | 1 | 02-12-2014| 05 2 | 1 | 04-03-2015| 10 3 | 2 | 21-04-2015| 35 4 | 3 | 03-12-2014| 15

paymenttbl

检索和更新数据的最快最简单的方法是什么?我目前的方式需要花费30分钟来更新表格,因为我迭代了paytbl然后我遍历pricetbl并将其与paymenttbl中的每个项目进行比较。

我的代码:

payID | pID | transDate | Price
--------------------------------
  1   |  1  | 02-12-2014| 10
  2   |  1  | 04-03-2015| 50
  3   |  2  | 21-04-2015| 40
  4   |  3  | 03-12-2014| 20

简单地迭代/检索数据就不会这样做。我还需要能够改变它。

1 个答案:

答案 0 :(得分:0)

执行此更新的最有效方法是不使用记录集并逐行,而是使用SQL执行基于集的更新。我尝试编写单个更新查询来实现,但MS-Access对查询不可更新非常挑剔,所以我写了两个查询:一个写入临时表(tempNewPrices),另一个使用该临时表更新PaymentTbl

这是创建包含新列NewPrice的临时表的第一个查询:

SELECT PaymentTbl.payID, PaymentTbl.pID, PaymentTbl.transDate, PaymentTbl.Price, 
(
  SELECT [Price] 
  FROM PriceTbl pr 
  WHERE pr.pID = PaymentTbl.pID 
  AND pr.[Date Effective] = (
    SELECT Max([Date Effective]) 
    FROM PriceTbl pr2 
    WHERE pr2.pID = pr.pID 
    AND pr2.[Date Effective]< PaymentTbl.[transDate]
  )
) AS NewPrice INTO tempNewPrices
FROM PaymentTbl;

这是更新查询以更改PaymentTbl中的Price值:

UPDATE tempNewPrices 
INNER JOIN PaymentTbl ON tempNewPrices.payID = PaymentTbl.payID 
SET PaymentTbl.Price = [NewPrice];

这比循环记录集要有效得多。