2013-04-07 70 views
7

我有一個表:從表中刪除所有重複行的最有效方法是什麼?

| foo | bar | 
+-----+-----+ 
| a | abc | 
| b | def | 
| c | ghi | 
| d | jkl | 
| a | mno | 
| e | pqr | 
| c | stu | 
| f | vwx | 

我想foo列刪除含重複所有行,以便表應該是這樣的:

| foo | bar | 
+-----+-----+ 
| b | def | 
| d | jkl | 
| e | pqr | 
| f | vwx | 

什麼是最有效如何做到這一點?

回答

9

您可以使用LEFT JOIN僅返回唯一foo子查詢加入牌桌。你希望沒有在子查詢匹配的行會被刪除,例如

DELETE a 
FROM TableName a 
     LEFT JOIN 
     (
      SELECT foo 
      FROM TableName 
      GROUP BY Foo 
      HAVING COUNT(*) = 1 
     ) b ON a.Foo = b.Foo 
WHERE b.Foo IS NULL 

爲了更快的性能,在Foo列中添加索引。

ALTER TABLE tableName ADD INDEX(foo) 
+0

這完美的作品,但它的速度太慢(我有一個非常大的表)。 – 2013-04-08 02:39:19

+0

在列上添加一個索引,使其更快執行,例如,'ALTER TABLE tableName ADD INDEX(foo)'並查看性能。 – 2013-04-08 03:01:17

+0

謝謝,但我已經做到了。但是,無論如何,這是最快捷的方式。 – 2013-04-08 04:16:23

8

使用EXISTS

DELETE a 
    FROM TableName a 
WHERE EXISTS (SELECT NULL 
       FROM TableName b 
       WHERE b.foo = a.foo 
      GROUP BY b.foo 
       HAVING COUNT(*) > 1) 

使用IN

DELETE a 
    FROM TableName a 
WHERE a.foo IN (SELECT b.foo 
        FROM TableName b 
       GROUP BY b.foo 
       HAVING COUNT(*) > 1) 
+0

如果我是正確的,你在這裏寫的存在版本比在版本中快得多。考慮到這一點,在版本中是否有任何爭論? – usumoio 2013-12-06 18:52:08

相關問題