Access SQL追加最新记录到历史表WHERE条件异常排查
问题原因
现有SQL的WHERE条件仅完成了「筛选源表最新ImportDate批次记录」的逻辑,未加入「目标表主键不存在才追加」的判断逻辑,因此SELECT段会直接返回最新批次下所有去重后的72条记录,这就是执行前提示待追加行数为72的原因。如果直接执行该语句,会因目标表主键约束触发重复值报错,无法自动过滤已存在的记录只追加新条目。
修正方案
在WHERE条件中追加NOT EXISTS判断,筛选出目标表中不存在主键匹配的记录再执行追加。默认两表的主键匹配字段为LeadNumber(如果是联合主键,在子查询中补充对应字段的等值匹配即可),修正后的SQL如下:
INSERT INTO leads_historical (Customer, LeadNumber, ImportDate) SELECT DISTINCT t1.Customer, t1.LeadNumber, t1.ImportDate FROM tbl_IMEI_MASTER AS t1 WHERE t1.ImportDate = (SELECT MAX(ImportDate) FROM tbl_IMEI_MASTER) AND NOT EXISTS ( SELECT 1 FROM leads_historical AS t2 WHERE t2.LeadNumber = t1.LeadNumber );
补充说明
- 若主键为多字段联合唯一(例如Customer+LeadNumber组合作为主键),只需修改NOT EXISTS子句内的匹配规则,补充对应字段的等值判断即可,示例匹配逻辑:
WHERE t2.LeadNumber = t1.LeadNumber AND t2.Customer = t1.Customer - 修正后执行查询前的待追加预览行数会和预期的14条一致,查询会在写入阶段前就过滤掉已存在的重复记录,不会触发主键冲突报错,运行逻辑更稳定。
内容的提问来源于stack exchange,提问作者Dre Day
相关产品推荐
相关产品推荐

