我有两个false
sql tables
和pricetbl
。由于物品价格每天都在变化,我需要用适当时间的价格更新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
简单地迭代/检索数据就不会这样做。我还需要能够改变它。
答案 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];
这比循环记录集要有效得多。