2013-11-21 67 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