如何根據某些字段刪除單表中的重複記錄?

維護項目時遇到一些問題,某張表中幾乎每一條記錄都有一個重複記錄,而它們的id和創建時間又不同,原因大概是SQL執行時間過長,一次請求完不成,這期間再進來一個請求,下面的相關操作會插入重複記錄。現在需要找出這些重複記錄並刪除,再想辦法解決插入重複的問題。

那麼,如何刪除單表中的重複記錄呢?並且條件是部分字段的值一樣才認爲是重複記錄。

我創建了一個簡單的表,來作爲例子。

repay表
 

該表中,我們認爲name,age,sex一致爲一條重複的記錄,應當找出來刪除掉。舉個例子,id爲1和id爲2的是一條重複記錄,而id爲3的那條記錄並不算重複記錄。表中用other字段表示該表中的其他字段信息,但它並不是構成重複的條件之一。

我們可以使用查詢:

SELECT * FROM repay r 
GROUP BY r.name,
r.age,
r.sex 
HAVING COUNT(*)>1

 

我們可以得到如上的查詢結果,取得了該表的重複記錄,想要刪除,如果直接執行以下代碼:

DELETE 
FROM
  repay 
WHERE id IN 
  (SELECT 
    id 
  FROM
    repay r 
  GROUP BY r.name,
    r.age,
    r.sex 
  HAVING COUNT(*) > 1)

就會報錯。錯誤代碼: 1093     You can't specify target table 'repay' for update in FROM clause。意思就是在同一個語句中,你不能先select出表中某些值再執行更新操作!所以需要加一箇中間表

DELETE 
FROM
  repay 
WHERE id IN 
  (SELECT 
    t.id 
  FROM
    (SELECT 
      * 
    FROM
      repay r 
    GROUP BY r.name,
      r.age,
      r.sex 
    HAVING COUNT(*) > 1) AS t)

執行完後,可以看到表中已經將重複記錄刪除。(注意,我定義的重複是指name,age,sex都一致才認爲是重複。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章