我每天都会得到一个CSV文件,作为带有appr的我的一个访问表(以下称为targetTable)的更新。 20至30.000行。为此,我创建了tempTable,在其中使用ADODB.Stream将CSV文件加载到其中并进行一些检查,并在成功完成检查后将所有条目加载到tempTable中。
我可以完全删除可定位目标,并从tempTable中插入所有条目,但是将检查是否有新条目(这意味着它已经在过去交付了)。为此,我有一列“已发现”,其中存储了该特定条目首次出现的日期。我将检查tempTable中的所有列以及targetTable中的所有列。
该表有近15列,而我的第一个解决方案是这样的:
DELETE * FROM targetTable WHERE (SELECT COUNT(*) FROM tempTable WHERE (targetTable.Id = tempTable.Id) AND (targetTable.Start = tempTable.Start) AND (targetTable.End = tempTable.End) ...
INSERT INTO targetTable SELECT tempTable.* FROM tempTable LEFT JOIN targetTable ON (targetTable.Id = tempTable.Id) AND (targetTable.Start = tempTable.Start) AND (targetTable.End = tempTable.End)
DELETE语句的性能真的很差,所以我尝试了这一点:
DELETE targetTable .* FROM targetTable LEFT JOIN tempTable ON ON (targetTable.Id = tempTable.Id) AND (targetTable.Start = tempTable.Start) AND (targetTable.End = tempTable.End) WHERE tempTable.Id Is Null;
我收到错误消息“无法在此表中删除”。在数据表视图中,速度似乎很高,但是我的陈述中肯定有错误。
有人有想法或更好的解决方案吗?
答案 0 :(得分:0)
使用不存在怎么办?像这样的东西。
DELETE targetTable.*
FROM targetTable
where not exists
(Select 1
from tempTable
where targetTable.Id = tempTable.Id
AND targetTable.Start = tempTable.Start
AND targetTable.End = tempTable.End
)