2015-11-24 30 views
0

我想從我的mysql表中刪除所有重複的記錄。我想這一點,但我有followint錯誤:刪除sql中的重複項:您無法在FROM子句中指定目標表'表'進行更新

You can't specify target table 'maTable' for update in FROM clause.

我已經看到這另一個主題,但我希望你能看到我在做什麼毛病我的疑問,我怎樣才能使它工作

DELETE 
FROM maTable 
WHERE id_table IN (SELECT id_table 
      FROM maTable GROUP by id_table 
     HAVING COUNT(id_table)>1) 
+0

@JulienBlanchard你是不正確的 - 'Count(id_table)'帶有'group by id_table'將返回'id_table'的出現次數。它會*不*總是1. – Siyual

+0

請注意,您*不*刪除只是重複 - 你刪除*所有*有重複的行。這可能是也可能不是你想要的。 – Luaan

+0

@Luaan這是我想要的,我在一個臨時表中記錄一個副本,然後用這個查詢刪除所有具有重複的行並在我的表中插入臨時表中的數據_maTable_ – tiaana

回答

1

嘗試包裹IN查詢在子查詢:

DELETE 
FROM maTable 
WHERE id_table IN (
    SELECT id_table 
    FROM (SELECT id_table 
     FROM maTable 
     GROUP by id_table 
     HAVING COUNT(id_table)>1) AS t) 

Demo here

2

這是MySQL的限制。它周圍的一種方法是使用join

DELETE m 
    FROM maTable m JOIN 
     (SELECT id_table, COUNT(*) as cnt 
      FROM maTable 
      GROUP BY maTable 
     ) mm 
     ON mm.id_table = m.id_table 
    WHERE cnt > 1; 

如果要刪除所有,但重複的一個(即保持一個值),那麼最好是有某種獨特的列如創建日期:

DELETE m 
    FROM maTable m LEFT JOIN 
     (SELECT id_table, min(creation_date) as mincd 
      FROM maTable 
      GROUP BY maTable 
     ) mm 
     ON mm.id_table = m.id_table AND m.creation_date = mm.mincd 
    WHERE mm.id_table IS NULL; 
相關問題