4

我的数据库中有一个表,其中包含要删除的重复记录。我不想为此创建一个包含不同条目的新表。我想要的是从现有表中删除重复条目而不创建任何新表。有没有办法做到这一点?

 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 具有公司名称,而 action 具有行业名称。

因此,在我的数据中,我在各自行业的 L11_data 中有重复的公司名称。

我想要的是存储在行动中的特定行业公司的唯一名称和其他数据。我希望我以一种你们可以理解的方式陈述了我的问题。

4

3 回答 3

18

是的,假设您有一个唯一的 ID 字段,您可以删除除 ID 之外的所有相同的记录,但它们的值组没有“最小 ID”。

示例查询:

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

笔记:

  • 我自由选择了“Table”和“ID”作为代表名称
  • 字段列表(“Field1,Field2,...”)应包括除 ID 之外的所有字段
  • 这可能是一个缓慢的查询,具体取决于字段和行的数量,但是我希望与替代方案相比它会没问题

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

于 2009-06-25T11:52:08.737 回答
4
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);

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

于 2009-06-25T11:55:23.707 回答
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 的组合必须明确地识别重复项。

于 2009-06-25T12:24:53.240 回答