删除多行而不知道行的名称

时间:2014-12-21 01:54:11

标签: mysql sql duplicates duplicate-removal

我有一个包含编写器名称的庞大数据库。

我的数据库中有多条记录,但我不知道哪些行是重复的。

如何在不知道值的情况下删除重复的行?

3 个答案:

答案 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;

演示:http://sqlfiddle.com/#!2/8886d/1/0

答案 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

这必须帮助你