2013-11-21 68 views
1

我想从我的链接表中删除重复的行。这里这个选择查询不工作:MySQL用子查询删除行

SELECT * 
from LINKS t1 
WHERE EXISTS (
    SELECT * 
    from LINKS t2 
    where t2.cntid = t1.cntid 
     and t2.title= t1.title 
     and t2.lnkid > t1.lnkid 
); 

当我改变了相同的查询,删除:

DELETE from LINKS t1 
WHERE EXISTS (
    SELECT * 
    from LINKS t2 
    where t2.cntid = t1.cntid 
     and t2.title= t1.title 
     and t2.lnkid > t1.lnkid 
); 

它不工作了,并指出:错误1064(42000):你有一个错误的SQL语法

这里有什么问题?有人可以帮助修复查询吗?

+0

因为'DELETE'和'SELECT'有不同的语法,是不是他们?.. –

回答

2

你可以做,只用JOINEXISTS和内嵌视图如下:

DELETE t1 
FROM LINKS t1, LINKS t2 
WHERE t2.cntid = t1.cntid 
    AND t2.title= t1.title 
    AND t2.lnkid > t1.lnkid 

这比使用EXISTS更快。当然,你可以像这样转换SELECT。

SELECT * 
from LINKS t1, LINKS t2 
WHERE t2.cntid = t1.cntid 
    AND t2.title= t1.title 
    AND t2.lnkid > t1.lnkid 

如果你尝试删除,PLZ set autocommit = '0'

+0

谢谢你,现在删除查询工作。但是,由于有几百万重复的行,所以删除查询现在运行了一个多小时,并且没有终点。我能以某种方式加快速度吗? – sub

+0

@sub很难打字。我正在使用智能手机,而且我的英语不好。你能否在其他问题上尝试我的答案?我真的很想知道这一点改善你。 Plz让我知道。 http://stackoverflow.com/questions/19929000/slow-mysql-query-on-update-statement/19929325#19929325 –

1

尝试:

DELETE t1 from LINKS t1 
    WHERE EXISTS (SELECT * from (select * from LINKS) t2 
        where t2.cntid = t1.cntid 
        and t2.title= t1.title 
        and t2.lnkid > t1.lnkid); 

SQLFiddle demo