我有一个包含编写器名称的庞大数据库。
我的数据库中有多条记录,但我不知道哪些行是重复的。
如何在不知道值的情况下删除重复的行?
答案 0 :(得分:1)
尝试:
delete from tbl
where writer_id in
(select writer_id
from (select * from tbl) t
where exists (select 1
from (select * from tbl) x
where x.writer_name = t.writer_name
and t.writer_id < x.writer_id));
参见演示: http://sqlfiddle.com/#!2/845ca3/1/0
这会保留每个writer_name
的第一行,按writer_id
升序排列。
然而,EXISTS子查询将针对每一行运行。你也可以尝试:
delete t
from
tbl t
left join ( select writer_name, min(writer_id) as writer_id
from tbl
group by writer_name ) x
on t .writer_name = x.writer_name
and x.writer_id = t .writer_id
where
x.writer_name is null;
演示:http://sqlfiddle.com/#!2/075f9/1/0
如果表上没有外键约束,您也可以使用create table as select
创建没有重复条目的新表,删除旧表,并将新表重命名为旧表的表#39 ; s的名字,最终得到你想要的东西。 (如果这个表有外键,这将不是一种方法)
看起来像这样:
create table tbl2 as (select distinct writer_name from tbl);
drop table tbl;
alter table tbl2 add column writer_id int not null auto_increment first,
add primary key (writer_id);
rename table tbl2 to tbl;
答案 1 :(得分:0)
SELECT a.*
FROM the_table a
INNER JOIN the_table b ON a.field1 = b.field1 AND (etc)
WHERE a.pk != b.pk
希望查询可以解决您的问题。
答案 2 :(得分:0)
DELETE a
FROM tbl a
LEFT JOIN tbl b
ON a.field1 = b.field1 (etc)
WHERE a.id < b.id
这必须帮助你