去除重复记录 MS Access SQL Microsoft

4

在Access中,我能够运行一个SELECT查询来查找需要删除的重复记录,但是无法执行将它们删除的查询。

这是显示重复记录并对它们进行分组的查询代码。它显示了1083条记录(它们已经被分组)。

SELECT Count(tblDat01Prod.[MFG #]) AS [CountOfMFG #], Last(tblDat01Prod.[MFG #]) AS [LastOfMFG #], tblDat01Prod.[MFG #]
FROM tblDat01Prod
GROUP BY tblDat01Prod.[MFG #]
HAVING (((Count(tblDat01Prod.[MFG #]))>1));

这是删除记录的代码,它想要删除所有记录,即使我只想要删除1083条。

DELETE tblDat01Prod.[MFG #]
FROM tblDat01Prod
WHERE (((tblDat01Prod.[MFG #]) In (SELECT Last(tblDat01Prod.[MFG #]) AS LastMFG
FROM tblDat01Prod
GROUP BY [MFG #]
HAVING (((Count(tblDat01Prod.[MFG #]))>1));)));

请问如何进行纠正?


在我回答你之前,我有个问题。你是想删除MFG#的重复项,还是删除lastOfManufacturingNumber的重复项?另外,为什么同时标记了Access和SQL Server? - J.S. Orris
MFG号的第一个条目 - Lucas Crostarosa
2个回答

6
查询本身存在几个问题,所以不能直接使用。主要原因是在删除项目时,项目计数会发生变化,因此引擎无法跟踪要删除的内容。
即便如此,您的查询也没有意义。Last函数不应该在与Count相同的列上。否则,您将删除每个重复项而不仅仅是每个重复项的最后一个。
如果您有主键,则可以分两步完成此操作。如果没有,则需要额外的步骤,因为您需要一个唯一字段:
如果没有主键,可以进行以下替代步骤:添加名为RecordId的自动编号字段。如果您已经有主键,请在以下步骤中使用它。
首先,创建一个临时表来存储要删除的ID。我们称之为temp_Delete:
SELECT Last([RecordId]) AS LastId INTO temp_Delete
FROM tblDat01Prod
GROUP BY [MFG #]
HAVING Count([MFG #])>1

第二步,运行一个删除语句,使用temp_Delete表来限制你要删除的内容。你将在RecordId字段上进行连接(注意:你可能无法在可视化编辑器中执行此操作,因为它会破坏你的SQL。你需要手动编写并运行它)。

DELETE DISTINCTROW  tblDat01Prod.* 
FROM  tblDat01Prod INNER JOIN temp_Delete 
ON tblDat01Prod.RecordId = temp_Delete.LastId

安全步骤:如果您担心丢失重要数据,我建议在删除之前添加另一个步骤。在tblDat01Prod中添加布尔型的IsDelete列,并使用temp_Delete表将匹配字段更新为True。然后在删除记录之前比较哪些记录被设置为删除,哪些没有。最后,删除IsDelete为true的记录,而不是上面所述的第2步。

最后,删除您的temp_Delete表以及您不想保留的任何添加到tblDat01Prod中的字段。


1
非常感谢你的帮助Don!我稍微修改了你的代码以满足我的需求,确保删除了正确的数据,但是你真是太棒了,+1(如果我有足够的声望的话)。
因为我需要删除数据库中最旧的记录,所以我在表视图中按日期输入排序表格,创建了一个名为DeleteOldestEntry的列,在Excel中粘贴了主键并创建了一个递增的数字列表,将这些数字再次粘贴回Access中的DeleteOldestEntry。然后我将你的代码修改为这样。
SELECT First(tblDat01Prod.[DeleteOldestEntry]) AS OldID, [MFG #] INTO temp_Delete
FROM tblDat01Prod
GROUP BY tblDat01Prod.[MFG #]
HAVING (((Count(tblDat01Prod.[MFG #]))>1));

然后运行删除语句。
DELETE DISTINCTROW tblDat01Prod.*
FROM tblDat01Prod INNER JOIN temp_Delete ON tblDat01Prod.DeleteOldestEntry = temp_Delete.OldID;

非常感谢您再次的帮助!

不用谢!很高兴你得到了需要的结果。即使你没有足够的声望来为我的回答点赞,如果我没错的话,你应该能够接受它作为正确的答案。 - Don Jewett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接