使用LEFT JOIN删除

问题描述 投票:0回答:1

我每天都会得到一个CSV文件,作为我的一个Access-Tables(以下简称:targetTable)和appr的更新。 20至30.000行。为此,我创建了tempTable,其中将CSV文件加载到ADODB.Stream并进行一些检查,并在成功检查后加载tempTable中的所有条目。

我可以完全删除目标并插入tempTable中的所有条目,但会检查是否有任何条目是新的(这意味着它已经在过去交付)。为此,我有一个“已发现”列,我在此处存储此特定条目首次出现时的日期。我将使用targetTable中的所有列检查tempTable中的所有列。

该表有近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;

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

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

performance ms-access left-join sql-delete
1个回答
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
)
© www.soinside.com 2019 - 2024. All rights reserved.