Mysql 删除SQL、CTE和其他所有不起作用的重复行

Mysql 删除SQL、CTE和其他所有不起作用的重复行,mysql,sql,Mysql,Sql,我试图从包含业务代码和业务描述的SQL表中删除大量重复行,但我必须为每个条目保留一行,我有1925行,我有345行,包含重复项和三重项,这是我用来查找重复项和三重项的查询: SELECT codice_ateco_2007, descrizione_ateco_2007, COUNT(*) AS CNT FROM codici_ateco_il_leone GROUP BY codice_ateco_2007, descrizione_ateco_2007 HAVING CNT > 1;

我试图从包含业务代码和业务描述的SQL表中删除大量重复行,但我必须为每个条目保留一行,我有1925行,我有345行,包含重复项和三重项,这是我用来查找重复项和三重项的查询:

SELECT codice_ateco_2007, descrizione_ateco_2007, COUNT(*) AS CNT FROM codici_ateco_il_leone GROUP BY codice_ateco_2007, descrizione_ateco_2007 HAVING CNT > 1;
我试过了,但都不起作用,当我使用CTE时,我得到一个错误,在WITH语句之后说未知函数,当我使用其他代码时,比如

DELETE
FROM MyDuplicateTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyDuplicateTable
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)
它无论如何都不会工作,它说我无法在in函数中选择表

CTE和其他代码是否过时了?有人如何解决这个问题?顺便说一下,codici_ateco_il_leone表中也有id主键。

一种方法是使用连接的行数:

类似的方法使用聚合:

delete mdt
    from MyDuplicateTable mdt join
         (select DuplicateColumn1, DuplicateColumn2, DuplicateColumn3, min(id) as min_id
          from MyDuplicateTable mdt2
          group by DuplicateColumn1, DuplicateColumn2, DuplicateColumn3
          having count(*) > 1
         ) mdt2
         using (DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)
    where mdt.id > mdt2.min_id;
这两种方法都假定id是每行的全局唯一标识符。从上下文来看,这似乎是合理的。但是,如果可以为三个键列的不同值复制id,则可以对这两种方法进行调整。

一种方法是使用连接的行编号:

类似的方法使用聚合:

delete mdt
    from MyDuplicateTable mdt join
         (select DuplicateColumn1, DuplicateColumn2, DuplicateColumn3, min(id) as min_id
          from MyDuplicateTable mdt2
          group by DuplicateColumn1, DuplicateColumn2, DuplicateColumn3
          having count(*) > 1
         ) mdt2
         using (DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)
    where mdt.id > mdt2.min_id;

这两种方法都假定id是每行的全局唯一标识符。从上下文来看,这似乎是合理的。但是,如果可以为三个键列的不同值复制id,则两者都可以调整。

您的delete语句很好,可以在几乎所有DBMS中工作-除了MySQL,在MySQL中会出现此愚蠢的错误。解决方法很简单:将from sometable替换为from select*from sometable somealias:


您的delete语句很好,可以在几乎所有的DBMS中工作——除了MySQL,在MySQL中您会遇到这个愚蠢的错误。解决方法很简单:将from sometable替换为from select*from sometable somealias:


WITH仅在8.0版之后的MySQL中可用。如果可以,请升级。另一方面:问问自己,复制品是如何进入表格的?如果你不想重复,应该有一个唯一的限制来阻止它们被插入。我知道在意大利,adeco代码是一个很长的商业类型列表,每个企业都有一个,我从他们网站上找到的PDF导入到ods到csv,如果说桌子上满是重复的东西,那么用开放式办公室删除重复的东西会花费太多的时间。谢谢。WITH仅在8.0版之后的MySQL中可用。如果可以,请升级。另一方面:问问自己,复制品是如何进入表格的?如果你不想重复,应该有一个唯一的限制来阻止它们被插入。我知道在意大利,adeco代码是一个很长的商业类型列表,每个企业都有一个,我从他们网站上找到的PDF导入到ods到csv,如果说桌子上满是重复的东西,那么用开放式办公室删除重复的东西会花费太多的时间。谢谢。哥们,你太棒了,我试过这个,效果很好!:从codici_ateco_il_leone mdt加入选择Codicie_ateco_2007,描述E_ateco_2007,minid为min_id从codici_ateco_il_leone mdt2组由Codicie_ateco_2007创建,描述E_ateco_2007使用Codicie_ateco_2007计数大于1 mdt2,描述E_ateco_2007,其中mdt.id>mdt2.min_id最后一个问题,如果我可以问你的话,mdt和mdt2像是连接的两个临时表吗?哥们,你太棒了,我试过这个,效果很好从codici_ateco_il_leone mdt加入选择Codicie_ateco_2007,描述E_ateco_2007,minid为min_id从codici_ateco_il_leone mdt2组由Codicie_ateco_2007创建,描述E_ateco_2007使用Codicie_ateco_2007计数大于1 mdt2,描述E_ateco_2007,其中mdt.id>mdt2.min_id最后一个问题,如果我可以问你的话,mdt和mdt2是否类似于连接的两个临时表?
DELETE
FROM MyDuplicateTable
WHERE ID NOT IN
(
  SELECT MAX(ID)
  FROM (SELECT * FROM MyDuplicateTable) t
  GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3
);