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 删除查询语法结合内连接问题的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础中级进阶

ms-access 中的左连接和内连接

MS Access 多个内连接

从 MS-Access 中联合选择查询中的 SQLite 语法错误

MS Access 内连接不精确匹配(通配符或类似)

MS Access 更新查询和带字符串参数的内部连接