【发布时间】:2015-02-26 17:40:33
【问题描述】:
我有一个这样定义的表:
其中ProviderId 是主键,StateID 是来自另一个表的外键。它在我的笔记本电脑上运行,因此,它是一个本地数据库。在我的表中,我有大约 900 万个条目。我知道事实上,表中有重复的条目,但只有当我们将它们与一些字段进行比较时,它们才是重复的。为了删除重复的条目,我运行了以下查询:
SET SQL_SAFE_UPDATES=0;
DELETE p1.*
FROM providers AS p1
JOIN (SELECT ProviderName AS PName, Address AS PAddr, StateID, Zip, MIN(ProviderId) AS PId
FROM providers
GROUP BY PName, PAddr, StateID, Zip
HAVING COUNT(*) > 1) AS p2
ON p1.ProviderName = p2.PName
AND p1.Address = p2.PAddr
AND p1.StateID = p2.StateID
AND p1.Zip = p2.Zip
AND p1.ProviderId > p2.PId;
关键是,它运行了大约 4 个半小时,它向我显示了标题上写的错误消息。你也可以看到它: 如何使查询更快,并克服收到的错误消息?
【问题讨论】:
-
你能澄清一下查询试图做什么吗?我了解加入但我不明白为什么
p1.providerID > p2.id?您是否尝试选择除最小提供商 ID 之外的所有内容? -
@McAdam331 正如我所写的,我尝试从表中删除重复的条目。我检查两个(或更多)行是否具有相同的
ProviderName、Address、StateID和Zip值。如果有,我想删除所有其他的,只留下一个。 -
好的。我不认为你可以用你的查询做任何事情,但我发现这个article 可能会有所帮助。这似乎只是因为你的桌子太大了。也许将其分解为更小的增量并运行 2 或 3 个删除查询?
-
您是否尝试过
LIMIT子句并简单地运行多次? -
@MarcusAdams 不是真的没有。你的意思是制作类似
... AND p1.ProviderId > p2.PId LIMIT 0, 100000;的东西?