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

时间:2016-05-20 09:42:45

标签: mysql sql sql-server sql-server-2008

所以我在这里遇到需要删除重复记录的情况。 这里的场景是我有5个关键字段。 4个字段是实际数据,第5个字段是自动生成的唯一编号。 因此,当我仅使用这4个字段来检查使用组的计数时,我有大约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值,应删除它们。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

请尝试此查询:

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

答案 1 :(得分:-1)

您可以使用CTE进行此操作。

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

编辑:

我建议您在运行删除后在Field1上添加Unique constraint。这样你就不会再遇到这种情况了。

ALTER TABLE mySuperHeroTable ADD CONSTRAINT UQ_mySuperHeroTable_Field1 UNIQUE (Field1);