如何刪除表中重覆記錄?

2021-05-22 06:31:59 字數 639 閱讀 8294

最近專案中遇到了乙個需求,即「如何刪除表中重覆記錄,使得所有重複的記錄都只保留一行?」。在google了半個小時之後,發現居然沒有乙個是正常可用的,於是乎只好自己動手寫了乙個。因為即便是grails提供了很好的gorm,但是使用sql仍然不可能完全避免,因此把它共享出來,也符合咱們**的「共享開發經驗」的宗旨。

具體的分析就不多說了,這裡面主要是sql的功夫,在此就直接列出解法,實驗是在mysql上做的,實驗用的表結構是(id, first_name, last_name, parent)。

基礎語句,列出重覆記錄:

第一種做法,使用not in:

上面的語句的意思應該非常直白了,簡直就是大白話。可問題是not in的效率並不是特別高,因此這就有了第二種解法,使用外聯結+is null + exists:

對於有主鍵或有唯一性約束的表,以上解法應該足夠了。但有時候如果沒有主鍵怎麼辦,雖然這一點似乎有點不可思議,但實際總會遇到,尤其在表不是你設計的時候。這時,只好採用乙個稍微有點「惡趣味」的做法:把distinct的結果放到另一張表中,drop掉原來的表,再把那張表重新命名:

以上就是基本的解決方案,但在實際中可能情況比較複雜,尤其是在有外來鍵關聯的時候,可能就有些問題了。但話說回來,既然決定要「刪除」記錄,那麼在作出這個決策的時候,應該就已經考慮過外來鍵的情形了吧

oracle 刪除表中重覆記錄

表demo是重複拷貝自dba objects,有88萬左右,不重複的是27323,沒有索引 方法一 delete from demo a where a.rowid select max rowid from demo b where b.object id a.object id 耗時 幾個小時以...

表刪除重覆記錄 小記

刪除資料庫中重覆記錄方法 表test loge 有兩個字段,乙個是 id,乙個是 name 我們需要刪除多餘的行 1 使用rowid 保留rowid 最大的值 delete from test loge a where rowid select max rowid from test loge b ...

刪除重覆記錄

我們經常在資料庫中有重複的記錄這時候我們希望刪除那些重複的記錄 你不要告訴我你是一條條手動刪除的哈 select distinct into newtable form 程式設計客棧nbsp tablename drop table tabwww.cppcns.comlename select in...