我有一个表单的 Access 表(我正在简化一点)
ID AutoNumber Primary Key
SchemeName Text (50)
SchemeNumber Text (15)
这包含一些数据,例如...
ID SchemeName SchemeNumber
--------------------------------------------------------------------
714 Malcolm ABC123
80 Malcolm ABC123
96 Malcolms Scheme ABC123
101 Malcolms Scheme ABC123
98 Malcolms Scheme DEF888
654 Another Scheme BAR876
543 Whatever Scheme KJL111
etc...
现在。我想删除相同 SchemeNumber 下的重复名称。但我想留下该方案编号最长的 SchemeName 的记录。 如果有相同最长长度的重复记录,那么我只想留下一个,比如最低的 ID(但任何一个都可以)。从上面的示例中,我想删除 ID 714、80 和 101(只留下 96)。
我认为这相对容易实现,但它变成了一场噩梦!感谢您的任何建议。我知道我可以以编程方式循环它,但我宁愿有一个 DELETE 查询。
最佳答案
查看此查询是否返回您要保留的行:
SELECT r.SchemeNumber, r.SchemeName, Min(r.ID) AS MinOfID
FROM
(SELECT
SchemeNumber,
SchemeName,
Len(SchemeName) AS name_length,
ID
FROM tblSchemes
) AS r
INNER JOIN
(SELECT
SchemeNumber,
Max(Len(SchemeName)) AS name_length
FROM tblSchemes
GROUP BY SchemeNumber
) AS w
ON
(r.SchemeNumber = w.SchemeNumber)
AND (r.name_length = w.name_length)
GROUP BY r.SchemeNumber, r.SchemeName
ORDER BY r.SchemeName;
如果是这样,请将其保存为 qrySchemes2Keep。然后创建一个 DELETE 查询以丢弃 tblSchemes 中 ID 值在 qrySchemes2Keep 中找不到的行。
DELETE
FROM tblSchemes AS s
WHERE Not Exists (SELECT * FROM qrySchemes2Keep WHERE MinOfID = s.ID);
请注意,如果您稍后使用 Access 的查询设计器对该 DELETE 查询进行更改,它可能会“有帮助地”将 SQL 转换为如下内容:
DELETE s.*, Exists (SELECT * FROM qrySchemes2Keep WHERE MinOfID = s.ID)
FROM tblSchemes AS s
WHERE (((Exists (SELECT * FROM qrySchemes2Keep WHERE MinOfID = s.ID))=False));
关于sql - 棘手的 MS Access SQL 查询以删除多余的重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874200/