本质上,您必须执行一系列操作查询:使用过滤器和联接的追加、更新和删除。您可以将查询保存为存储查询并通过以下方式调用它们DoCmd.OpenQuery
,或者您可以在 VBA 中将它们编写为要传递到的字符串DoCmd.RunSQL sqlStatement
or CurrentDb.Excecute sqlStatement
IMPORT
首先,使用导入 CSVDoCmd.TransferText acImportDelim
到临时表中。请务必在导入之前清除临时表中以前的 csv 数据。
DELETE FROM tempTable;
UPDATE
然后,更新临时表和实时表之间的现有记录,但更新实时表中现有客户的条件。在 Access SQL 中,联接可用于更新查询,但您可能会遇到不可更新查询:
UPDATE tempTable INNER JOIN liveTable
ON tempTable.CustomerID = liveTable.CustomerID
SET liveTable.Col1 = tempTable.Col1,
liveTable.Col2 = tempTable.Col2,
liveTable.Col3 = tempTable.Col3,
... ;
或者,绕过不可更新的查询:
UPDATE liveTable
SET liveTable.Col1 = DLookUp("Col1", "tempTable", "CustomerID=" & liveTable.CustomerID),
liveTable.Col2 = DLookUp("Col2", "tempTable", "CustomerID=" & liveTable.CustomerID),
liveTable.Col3 = DLookUp("Col3", "tempTable", "CustomerID=" & liveTable.CustomerID),
...
WHERE CustomerID IN
(SELECT CustomerID FROM tempTable);
完成后,清除临时表中刚刚更新的记录(以免与追加步骤和重复条目冲突):
DELETE FROM tempTable
WHERE CustomerID IN
(SELECT CustomerID FROM liveTable);
APPEND
最后,将临时表中的新记录追加到实时表中,但条件是客户不在实时表中,您可以使用LEFT JOIN ... NULL
:
INSERT INTO (Col1, Col2, Col3 ...)
SELECT Col1, Col2, Col3 ...
FROM tempTable LEFT JOIN liveTable
ON tempTable.CustomerID = liveTable.CustomerID
WHERE liveTable.CustomerID Is Null;