mysql、oracle 去重(資料庫刪除重複資料保留一條)
阿新 • • 發佈:2019-01-06
現在在資料庫中有2對重複資料,2條正常資料,我想要把重複資料都刪掉
講一下思路
根據重複欄位分組,並增加約束條件,查詢出所有的,重複資料的最小id,和重複的屬性
SELECT uname,MIN(uid) FROM tbl_user GROUP BY uname HAVING COUNT(uid)>1;
現在查詢出來的id就是我們出現重複資料的欄位,需要保留的那個欄位的id
然後根據條件刪除
重複的屬性名字,但是卻不是我想要保留的id都要刪除掉
DELETE FROM tbl_user WHERE uname IN ( SELECT uname FROM tbl_user GROUP BY uname HAVING COUNT( uid ) > 1 ) AND uid NOT IN ( SELECT MIN( uid ) FROM tbl_user GROUP BY uname HAVING COUNT( uid ) > 1 )
注意如果是mysql資料庫,會報錯
1093 - You can't specify target table 'tbl_user' for update in FROM clause
原因:
mysql 資料庫不可以在使用同一張表的查詢為條件更新這張表
解決辦法:將查詢的資料起別名再次查詢,包裝一下。
DELETE FROM tbl_user WHERE uname IN ( SELECT * FROM ( SELECT uname FROM tbl_user GROUP BY uname HAVING COUNT( uid ) > 1 ) a ) AND uid NOT IN ( SELECT * FROM ( SELECT MIN( uid ) FROM tbl_user GROUP BY uname HAVING COUNT( uid ) > 1 ) a )