【问题标题】:Simply delete duplicate content in a sql table只需删除 sql 表中的重复内容
【发布时间】:2013-01-10 23:02:30
【问题描述】:

我想知道是否有一种简单的方法可以从表 sql 中删除重复项。

而不是获取整个表并在它们出现两次时删除数据。

提前谢谢你

这是我的结构:

CREATE TABLE IF NOT EXISTS `mups` (
  `idgroupe` varchar(15) NOT NULL,
  `fan` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

  • 您使用的是什么关系型数据库?请添加表结构和一些示例数据。
  • 您还需要定义什么是重复项。整行是否重复?它是特定列或一组列中的重复项吗?
  • 这里有很多类似的问题。Just one of them.
  • 我更新了我的表结构
  • 删除重复项后,对表实施UNIQUE 约束(确定两行是否重复时应考虑的任何列),这样您就不必重复执行此操作.

标签: mysql sql duplicates innodb


【解决方案1】:

如果您使用的是 Sql Server

检查这个:SQL SERVER – 2005 – 2008 – Delete Duplicate Rows

使用 CTE 的示例代码:

/* Delete Duplicate records */
WITH CTE (COl1,Col2, DuplicateCount)
AS
(
SELECT COl1,Col2,
ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount
FROM DuplicateRcordTable
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO

【讨论】:

  • 这不起作用! WITH mups (idgroupe,fan, DuplicateCount) AS ( SELECT idgroupe,fan, ROW_NUMBER() OVER(PARTITION BY idgroupe,fan ORDER BY idgroupe) AS DuplicateCount FROM mups ) DELETE FROM mups WHERE DuplicateCount > 1
【解决方案2】:

添加一个计算列,该列采用整行的校验和。搜索任何重复的校验和,对重复项进行排名并删除。

【讨论】:

  • 校验和会产生误报。例如,如果校验和是 32 位宽,那么您只需要大约 80000 行不同的行,两个校验和相同的可能性 >50%。
【解决方案3】:

你可以这样做:

DELETE from yourTable WHERE tableID in 
(SELECT clone.tableID 
 from yourTable origine,
  yourTable clone 
 where clone.tableID= origine.tableID)

但在 WHERE 中,你可以比较索引或相互比较字段...

取决于你如何找到你的双打。

请注意,此解决方案的优点是让您选择什么是双精度(例如,如果 PK 发生变化)

【讨论】:

    【解决方案4】:

    您可以查找重复项,方法是将表连接到自身,按要查找重复项的字段进行分组,并在 count 大于 1 的情况下使用 having 子句。

    假设您的表名称是客户,并且您正在寻找重复的名称字段。

    select cust_out.name, count(cust_count.name)
    from customers cust_out
      inner join customers cust_count on cust_out.name = cust_count.name
    group by cust_out.name
    having count(cust_count.name) > 1
    

    如果您在删除语句中使用它,您将删除所有重复记录,而您可能打算保留这些记录。

    所以要选择要删除的记录,

    select cust_dup.id
    from customers cust
      inner join customers cust_dup on cust.name = cust_dup.name and cust_dup.id > cust.id
    group by cust_dup.id
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 2017-11-28
      • 2014-01-11
      • 2012-02-24
      • 2023-04-10
      • 1970-01-01
      • 2017-12-04
      • 2021-03-06
      • 1970-01-01
      相关资源
      最近更新 更多