我有一个带有自动增量列(id)的数据库表(test_table),当3个特定列(A,B,C)具有相同的条目时,我想删除所有双(或更多)条目。
id column_A column_B column_C
------------------------------------------------
1 ooo aaa uuu
2 ooo aaa uuu
3 ttt ppp uuu
4 ooo aaa uuu
5 iii kkk ccc
在此示例中,执行 DELETE 查询后,应删除ID为 2 和 4 的行。
问候。
答案 0 :(得分:3)
DELETE FROM tbl
WHERE `id` NOT IN ( SELECT * FROM (
SELECT MIN(`id`)
FROM tbl
GROUP BY `column_A`
, `column_B`
, `column_C`
) x
)
答案 1 :(得分:1)
你可以在删除查询中使用自联接,联接中的子查询将加入重复的行,条件t.id > tt.id
将保留最小的id记录,其他重复项将被删除
delete t.* from t
join (
select * from t
group by `column_A`, `column_B`, `column_C`
having count(*) > 1
) tt
on(t.`column_A` = tt.`column_A`
AND t.`column_B` = tt.`column_B`
AND t.`column_C` = tt.`column_C`
AND t.id > tt.id)
我已经添加了另外一个第5行的副本来测试它
答案 2 :(得分:0)
我很快就从https://www.linkedin.com/groups/How-delete-duplicate-rows-in-78638.S.218942398借用了这个:
步骤1:将非重复项(唯一元组)移动到临时表
中CREATE TABLE new_table AS SELECT * FROM old_table WHERE 1 GROUP BY [COLUMN TO remove duplicates BY];
第2步:删除旧表
DROP TABLE old_table;
步骤3:将new_table重命名为old_table的名称
RENAME TABLE new_table TO old_table;
然后你可以编辑新表,让A列成为主键,不再发生任何欺骗。
答案 3 :(得分:0)
DELETE x
FROM t x
LEFT
JOIN
( SELECT column_a
, column_b
, column_c
, MIN(id) min_id
FROM t
GROUP
BY column_a
, column_b
, column_c
) y
ON y.column_a = x.column_a
AND y.column_b = x.column_b
AND y.column_c = x.column_c
AND y.min_id = x.id
WHERE y.min_id IS NULL