2014-12-21 127 views

回答

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没有重复的条目来创建新表的表没有外键约束,删除旧表,并将新表重新命名为旧表的名称,最终得到您想要的结果。 (这不会是要走的路,如果这个表有外键虽然)

这将是这样的:

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

+0

我正在使用一个表,我想删除此表中特定列(writer_name)中的多个记录。这是否使我的问题更清晰? – salep

+0

桌子上有哪些其他栏目?什么决定了哪一行,哪些作者再次出现2,3,4 ...次? –

+0

http://i.imgur.com/hjtxNyo.png见,弗兰兹卡夫卡存在两次。我想删除第二个(或第三个,第四个,取决于具体情况)值。 – salep

0
SELECT a.* 
FROM the_table a 
INNER JOIN the_table b ON a.field1 = b.field1 AND (etc) 
WHERE a.pk != b.pk 

希望查询能解决您的问题。

+1

如果我正确阅读,问题是关于删除行,而不是选择.. –

+0

我不能让它工作。我想删除包含相同值的行。如果可能的话,你可以编辑你的答案吗? – salep

+0

您可以使用这个http://stackoverflow.com/questions/8019957/delete-from-where-in – user3827706

0
DELETE a 
FROM tbl a 
LEFT JOIN tbl b 
ON a.field1 = b.field1 (etc) 
WHERE a.id < b.id 

这一定帮你

相关问题