我的数据库中有一个表,其中包含我要删除的重复记录。我不想为此创建一个包含不同条目的新表。我想要的是从现有表中删除重复的条目,而不创建任何新表。有没有办法做到这一点?
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中为各自的行业提供了重复的公司名称。
我想要的是存储在行动中的特定行业中公司的唯一名称和其他数据。我希望我以一种人们可以理解的方式陈述我的问题。
答案 0 :(得分:12)
是的,假设您有一个唯一的ID字段,您可以删除除ID之外的所有相同记录,但没有其值组的“最小ID”。
示例查询:
DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)
注意:
编辑:如果您没有唯一索引,我的建议是简单地添加一个自动增量唯一索引。主要是因为它的设计很好,但也因为它可以让你运行上面的查询。
答案 1 :(得分:4)
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);
重复项获取NULL,然后您可以删除它们
答案 2 :(得分: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的组合必须区别地识别重复项。