1

我有以下 SQL 来删除表中的重复值,

DELETE p1 
FROM `ProgramsList` p1, `ProgramsList` p2  
WHERE p1.CustId = p2.CustId 
    AND p1.CustId = 1 
    AND p1.`Id`>p2.`Id` 
    AND p1.`ProgramName` = p2.`ProgramName`;

Id
对于给定的自动增量CustId ProgramName必须是唯一的(目前不是)
上面的 SQL 大约需要 4 到 5 小时才能完成大约 1,000,000 条记录

任何人都可以建议一种从表中删除重复项的更快方法吗?

4

2 回答 2

1

首先,如果您还没有索引,您可以尝试将索引添加到 ProgramName 和 CustID 字段。

去重复

您可以对记录进行分组以识别受骗者,并在执行此操作时获取每个组的最小 ID 值。然后,只需删除 ID 不是 MinID 之一的所有记录。

条款内方法

delete from
 ProgramsList
where
 id not in 
    (select min(id) as MinID
      from ProgramsList
      group by ProgramName, CustID) 

连接方法

如果每个组有很多成员,您可能需要多次运行此操作。

DELETE P
FROM ProgramsList as P
INNER JOIN 
    (select count(*) as Count, max(id) as MaxID
     from ProgramsList
     group by ProgramName, CustID) as A on A.MaxID = P.id
WHERE A.Count >= 2

有些人对 In-Clause 有性能问题,有些人则没有。这在很大程度上取决于您的索引等。如果一个太慢,请尝试另一个。

相关:https ://stackoverflow.com/a/4192849/127880

于 2013-02-11T16:58:45.627 回答
0

这将一次性删除所有重复项。

从内部查询中得到一个没有被删除的 ID,其余的被每个程序删除。

delete p from ProgramsList as p
INNER JOIN (select ProgramName as Pname, max(id) as MaxID
     from ProgramsList
     group by ProgramName, CustID order by null) as A on  Pname=P.ProgramName
    where A.MaxID != P.id
于 2013-08-20T09:20:40.943 回答