用左联接删除

时间:2019-03-04 19:00:19

标签: performance ms-access left-join sql-delete

我每天都会得到一个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;

我收到错误消息“无法在此表中删除”。在数据表视图中,速度似乎很高,但是我的陈述中肯定有错误。

有人有想法或更好的解决方案吗?

1 个答案:

答案 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
)