1. 程式人生 > >mysql、oracle 去重(資料庫刪除重複資料保留一條)

mysql、oracle 去重(資料庫刪除重複資料保留一條)

現在在資料庫中有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 )

完美