MS ACCESS 删除查询语法结合内连接问题
Posted
技术标签:
【中文标题】MS ACCESS 删除查询语法结合内连接问题【英文标题】:MS ACCESS delete query syntax combined with inner join problems 【发布时间】:2014-04-22 19:03:17 【问题描述】:我无法让后续删除查询正常工作(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 返回消息指定包含您要删除的记录的表。任何帮助将不胜感激。
【问题讨论】:
也许delete b.* From T_Value b
您不能同时从两个表中删除,因此您必须指定从哪个表中删除。现在的问题是您要保留较低的 dataID 还是较新的 dataId。它将确定您的意思是 b.* 还是 a.*
我刚刚尝试了您的建议,访问回复为“无法从指定的表中删除”。
构建一个选择语句,使其包含您要使用查询生成器删除的记录。然后将其从选择更改为删除。查看那里的 SQL,看看它做了什么。
How to delete in MS Access when using JOIN's?的可能重复
【参考方案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 )
【讨论】:
DistinctRow
是 Access SQL 独有的关键字。我只见过它在 SELECT 语句中使用过,而且从来没有用过它。 Distinct
非常相似且更标准,因此我使用 SELECT 代替。此解决方案展示了 DistinctRow 的用途。以上是关于MS ACCESS 删除查询语法结合内连接问题的主要内容,如果未能解决你的问题,请参考以下文章