sql - 棘手的 MS Access SQL 查询以删除多余的重复记录

标签 sql performance ms-access

我有一个表单的 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/

相关文章:

.net - 如何在执行大型 SQLCommand VB.Net 时显示进度条

mysql - SELECT LIKE 中的多个关键字

sql - 如何在SQL中选择 'previous'和 'next'记录?

java - 调整集合以容纳大量对象

ios - viewWillDisappear 和 viewDidDissapear 之间的延迟

ms-access - Access 、ADO 和 64 位

sql - 使用 ORDER BY 子句的替代结果

android - Titanium:iPhone 应用程序到 android 的问题

ms-access - Access VBA 代码以打印每条记录的单个 PDF - 在第 10 条记录处停止

ms-access - ASP 奇怪的未指定错误 - 80004005