2013-04-23 65 views
1

我需要清除我的數據庫,我需要根據3列清除所有重複的條目。根據3列清除表中的重複條目

我tryed這一點:

ALTER IGNORE TABLE prod_assoc_variacao ADD UNIQUE INDEX idx_name (fk_produto, fk_grupo, fk_classificador) 

,但我發現錯誤,味精,告訴我有重複的條目幾排,所以這是行不通的刪除重複項。

所以我tryed這太:

DELETE 
FROM prod_assoc_variacao 
WHERE prod_assoc_variacao.id IN ( 
    SELECT MAX(id) 
    FROM prod_assoc_variacao 
    GROUP BY fk_produto, fk_grupo, fk_classificador 
    HAVING COUNT(*) > 1) 

,但我發現[錯誤] 1093 - 您不能指定目標表 'prod_assoc_variacao' 的更新在FROM子句。

現在我不知道該怎麼辦,我的sql不是很好,也不知道。

我非常感謝任何幫助mutch。

在此先感謝。您可以使用

+0

我認爲使用** ALIAS **可以解決問題。我使用** Update ** Query時有類似的錯誤,但我確定。但嘗試使用** ALIAS ** – Luv 2013-04-23 18:03:15

回答

1

你可以加入表本身的刪除:

delete prod_assoc_variaca from prod_assoc_variaca 
    inner join prod_assoc_variaca p2 on prod_assoc_variaca.fk_produto = p2.fk_produto 
    and prod_assoc_variaca.fk_grupo = p2.fk_grupo 
    and prod_assoc_variaca.fk_classificador = p2.fk_classificador 
    and prod_assoc_variaca.id < p2.id; 

SQL Fiddle Demo

只是重讀您的文章 - 如果你想刪除的更高的ID,用>代替。

+0

工程就像一個魅力。謝謝。我嘗試了這種方法,但我不確定這是否正確。 – Guerra 2013-04-23 18:20:20

+1

@Guerra - np,很高興我們能幫到你! – sgeddes 2013-04-23 18:23:40

1

一種方法是做一個臨時表,選擇ID的成,然後使用臨時表中的delete語句

create temporary table t(id integer); 

insert into t 
SELECT MAX(id) 
FROM prod_assoc_variacao 
GROUP BY fk_produto, fk_grupo, fk_classificador 
HAVING COUNT(*) > 1; 

DELETE 
FROM prod_assoc_variacao 
WHERE prod_assoc_variacao.id IN (
    select id from t 
) 
+0

+1。但是,我不是在看什麼。不管怎麼說,還是要謝謝你。 – Guerra 2013-04-23 18:19:32