【问题标题】:Delete Duplicate Records in table using SQL [duplicate]使用 SQL 删除表中的重复记录 [重复]
【发布时间】:2016-09-17 12:28:09
【问题描述】:

所以我在这里遇到了需要删除重复记录的情况。 这里的场景是我有 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 个字段是实际数据字段。

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

请帮帮我。

【问题讨论】:

  • MySQL 还是 MS SQL Server?不要标记未涉及的产品。
  • 无论哪个dbms,这是一个很老的问题,搜索一下很容易找到。
  • 具有讽刺意味的“重复”问题被标记为重复!

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


【解决方案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);

【讨论】:

  • 我们不应该按所有四个字段进行分区吗?
  • 这将只保留第一个 Batman Row 和第一个 flash 行(按 ID (ASC) 排序)。当然还有独一无二的超人行。
  • 我明白这一点。实际上,阅读这个问题,我认为可能有超过 1 行的字段 1 蝙蝠侠,但字段 2,3 和 4 中的值不同。我们可能希望保留它们,作为一个整体,行不会重复。但无论如何,这里的情况似乎并非如此。 Parsu 只想要蝙蝠侠的 1 行,无论字段 2,3 和 4 中的值如何。
【解决方案2】:

请试试这个查询:

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

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 2020-07-16
    • 2021-02-13
    • 2010-10-24
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多