MS ACCESS删除查询语法并结合内部联接问题

时间:2014-04-22 19:03:18

标签: sql ms-access

我无法使跟随删除查询生效(ms access 2007)

DELETE FROM T_Value b  
INNER JOIN T_Value AS a ON b.MeasTime = a.MeasTime 
AND b.JobId = a.JobId 
WHERE b.DataId > a.DataId

查询的目的是有效地删除重复的条目。 DataId是表单个主键。通过比较MeasTime和JobId字段确定重复条目。

Access返回消息指定包含您要删除的记录的表。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

当您加入这两个表时,您可以创建一些关于要删除的内容的歧义,例如,第一个表中的行可能在第二个表中有许多匹配项。一旦加入,联接表中的第一个表将有许多行的副本,当您尝试使用连接的表从第一个表中删除条目时,这会混淆Access。

有几种解决方案:

1)使用DistinctRow:这将停止上一个问题,因为这意味着联接表中的每一行都是唯一的,可以防止上一个问题:

DELETE DISTINCTROW b.* FROM T_Value b  
INNER JOIN T_Value AS a ON b.MeasTime = a.MeasTime 
AND b.JobId = a.JobId 
WHERE b.DataId > a.DataId

2)使用子查询:虽然子查询可能很慢,但这可以防止结果出现任何歧义,并且您不必删除重复的行:

DELETE b.* FROM T_Value b   
WHERE b.DataId > a.DataId
AND EXISTS ( SELECT 1 FROM T_Value WHERE MeasTime = b.MeasTime ) 
AND EXISTS ( SELECT 1 FROM T_Value WHERE JobId = b.JobId )