我有以下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条记录
有人可以建议更快捷地从表中删除重复项吗?
答案 0 :(得分:0)
首先,您可以尝试将索引添加到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时遇到性能问题,有些则没有。这很大程度上取决于您的索引等。如果一个太慢,请尝试另一个。
答案 1 :(得分:0)
这将一次删除所有重复项。
从内部查询中获取一个ID,该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