Mysql 使用SQL删除表中的重复记录

Mysql 使用SQL删除表中的重复记录,mysql,sql,sql-server,sql-server-2008,Mysql,Sql,Sql Server,Sql Server 2008,所以我有一个需要删除重复记录的情况。 这里的场景是我有5个关键字段。 4个字段为实际数据,第5个字段为自动生成的唯一编号。 因此,当我仅使用这4个字段来使用group检查计数时,我有大约400条记录的副本。但这些重复记录的唯一编号不同(我们可以删除唯一编号最大值的记录)。 有没有办法删除这些重复记录? 还有其他6个非主键字段,但仅供参考 比如说: +----------+-------+---------+---------+-----------+ | Field | Field | F

所以我有一个需要删除重复记录的情况。 这里的场景是我有5个关键字段。 4个字段为实际数据,第5个字段为自动生成的唯一编号。 因此,当我仅使用这4个字段来使用group检查计数时,我有大约400条记录的副本。但这些重复记录的唯一编号不同(我们可以删除唯一编号最大值的记录)。 有没有办法删除这些重复记录? 还有其他6个非主键字段,但仅供参考

比如说:

+----------+-------+---------+---------+-----------+
| Field    | Field | Field 3 | Field 4 | Unique,Id |
|   1      |   2   |         |         |           |
+----------+-------+---------+---------+-----------+
| Batman   | 100   | 50      | Chicago | 100       |
+----------+-------+---------+---------+-----------+
| Batman   | 100   | 50      | Chicago | 101       |
+----------+-------+---------+---------+-----------+
| Superman | 50    | 50      | Florida | 102       |
+----------+-------+---------+---------+-----------+
| Flash    | 90    | 40      | London  | 103       |
+----------+-------+---------+---------+-----------+
| Flash    | 90    | 40      | London  | 104       |
+----------+-------+---------+---------+-----------+
在本例中,前4个字段是实际数据字段

所以你可以看到蝙蝠侠和flash有重复的值(对于前4个字段),但是唯一的id是不同的。所以在这里,我需要从每个记录中删除一条记录,这样它们就不会保留为重复记录。可以删除该重复记录的唯一id的最大值。所以102和104是蝙蝠侠和Flash的最大唯一id值,应该删除它们


请帮我做这件事。

你可以用CTE来做

WITH cte as (
select
 ROW_NUMBER() OVER ( PARTITION BY FIELD1 ORDER BY ID) FirstOcurrence,
*
from mySuperHeroTable 
)
delete from cte where FirstOcurrence <> 1

你可以用CTE来做

WITH cte as (
select
 ROW_NUMBER() OVER ( PARTITION BY FIELD1 ORDER BY ID) FirstOcurrence,
*
from mySuperHeroTable 
)
delete from cte where FirstOcurrence <> 1
请尝试此查询:

DELETE 
FROM 
    MYTABLE 
FROM 
    MYTABLE
LEFT JOIN
(
SELECT 
    FIELD1,FIELD2,FIELD3,FIELD4,MIN(ID) AS ID
FROM
    MYTABLE
GROUP BY 
    FIELD1,FIELD2,FIELD3,FIELD4
)TbMain
ON 
    MYTABLE.FIELD1=TbMain.FIELD1
    AND
    MYTABLE.FIELD2=TbMain.FIELD2
    AND
    MYTABLE.FIELD3=TbMain.FIELD3
    AND
    MYTABLE.ID =TbMain.ID
WHERE
    TbMain.ID IS NULL
请尝试此查询:

DELETE 
FROM 
    MYTABLE 
FROM 
    MYTABLE
LEFT JOIN
(
SELECT 
    FIELD1,FIELD2,FIELD3,FIELD4,MIN(ID) AS ID
FROM
    MYTABLE
GROUP BY 
    FIELD1,FIELD2,FIELD3,FIELD4
)TbMain
ON 
    MYTABLE.FIELD1=TbMain.FIELD1
    AND
    MYTABLE.FIELD2=TbMain.FIELD2
    AND
    MYTABLE.FIELD3=TbMain.FIELD3
    AND
    MYTABLE.ID =TbMain.ID
WHERE
    TbMain.ID IS NULL

MySQL还是MS SQL Server?不要给不涉及的产品贴标签。无论哪个数据库管理系统,这是一个非常古老的问题,如果搜索的话很容易找到。讽刺的是,一个“重复”的问题被标记为重复!MySQL还是MS SQL Server?不要给不涉及的产品贴标签。无论哪个数据库管理系统,这是一个非常古老的问题,如果搜索的话很容易找到。讽刺的是,一个“重复”的问题被标记为重复!我们不应该按所有四个字段进行分区吗?这将只保留第一个蝙蝠侠行和第一个flash行(按ID排序(ASC))。当然超人排是独一无二的,我理解。事实上,读到这个问题,我想可能有超过1行的字段1蝙蝠侠,但字段2、3和4的值不同。我们可能希望保留它们,作为一个整体,行不会重复。但无论如何,看起来这里不是这样。Parsu只希望有一行有蝙蝠侠,与字段2、3和4中的值无关。我们不应该按所有四个字段进行分区吗?这将只保留第一个蝙蝠侠行和第一个flash行(按ID排序(ASC))。当然超人排是独一无二的,我理解。事实上,读到这个问题,我想可能有超过1行的字段1蝙蝠侠,但字段2、3和4的值不同。我们可能希望保留它们,作为一个整体,行不会重复。但无论如何,看起来这里不是这样。无论字段2、3和4中的值如何,Parsu只希望蝙蝠侠有一行。