从表中删除重复行

5

我在数据库中有一张表,里面有重复的记录,我想要删除这些重复的记录。但我不想创建一个只包含唯一值的新表。我想要的是在不创建新表的情况下从现有表中删除重复的记录。有没有什么办法可以做到这一点?

 id           action
 L1_name      L1_data
 L2_name      L2_data
 L3_name      L3_data   
 L4_name      L4_data
 L5_name      L5_data
 L6_name      L6_data
 L7_name      L7_data
 L8_name      L8_data
 L9_name      L9_data
 L10_name     L10_data
 L11_name     L11_data
 L12_name     L12_data
 L13_name     L13_data 
 L14_name     L14_data
 L15_name     L15_data

以下是我的所有字段:
id 是每一行的唯一标识。
L11_data 是每个操作字段的唯一标识。
L11_data 中包含公司名称,而操作中包含行业名称。

因此,在我的数据中,我在 L11_data 中有重复的公司名称,对应它们所属的行业。

我的目标是在操作中存储公司的唯一名称和其他数据。我希望我已经清楚地表达了我的问题,让您能够理解。


1
如果您想要一个代码答案,您需要提供具有重复数据的表的模式。此外,您应该在问题上保留SQL标签,以获得更多的浏览量,并提高问题得到满意回答的可能性。 - Welbog
3个回答

19

是的,假设你有一个唯一的ID字段,你可以删除所有除ID以外完全相同但其所属值组中没有"最小ID"的记录。

查询示例:

DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)

注意:

  • 我自由选择了"表格"和"ID"作为代表性名称
  • 字段列表("Field1, Field2, ...")应该包括除ID外的所有字段
  • 根据字段和行数的数量,这可能是一个较慢的查询,但与其他替代方案相比,我认为这应该是可以接受的

编辑:如果您没有唯一索引,则我的建议是简单地添加一个自动增量唯一索引。主要是因为它是好的设计,也因为它将允许您运行上面的查询。


ID通常是数字,所以不应该有问题,但只要在ID上定义了“MIN”,它就可以工作。如果在字符串上定义并且字段是唯一的,那么它将非常有效。 - Roee Adler
我喜欢你的解决方案..只是想澄清一下...如果表没有唯一索引,那么这将是一个问题,对于一个问题来说有多个选项是很好的。 - Svetlozar Angelov
MySQL不允许在内部查询中引用同一张表时对该表进行UPDATEINSERTDELETE等操作。请参考https://dev59.com/7m855IYBdhLWcg3wSiM7。 - Adam Joseph Looze

4
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);

重复项变为NULL,然后您可以删除它们。

0
DELETE
FROM table_x a
WHERE rowid < ANY (
  SELECT rowid
  FROM table_x b
  WHERE a.someField = b.someField
   AND a.someOtherField = b.someOtherField
  )
WHERE (
  a.someField,
  a.someOtherField
  ) IN (
  SELECT c.someField,
   c.someOtherField
  FROM table_x c
  GROUP BY c.someField,
   c.someOtherField
  HAVING count(*) > 1
  )

在上述查询中,someField和someOtherField的组合必须能够唯一地识别重复项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接