天天看點

用SQL語句删除資料庫重複資料,隻保留一條有效資料

作者:字詞易查小程式

原文連結 http://t.zoukankan.com/c-Ajing-p-13448349.html

在實際開發中,可能會遇到資料庫多條資料重複了,此時我們需要删除重複資料,隻保留一條有效資料,用SQL語句怎麼實作呢,下面我們模拟一下:

1.準備重複資料:

用SQL語句删除資料庫重複資料,隻保留一條有效資料

2.過濾出存在重複資料的資訊:

SQL語句:

SELECT
	dname 
FROM
	dept 
GROUP BY
	dname 
HAVING
	count( dname ) >1
           

資料庫篩選結果:

用SQL語句删除資料庫重複資料,隻保留一條有效資料

3.從重複資料中篩選出一條需要儲存的資料:

SQL語句:

SELECT
	min( deptno ) -- max( deptno )
	
FROM
	dept 
GROUP BY
	dname 
HAVING
	count( dname ) >1
           

這裡使用資料庫的MIN或者MAX函數篩選出一條需要儲存資料即可。

資料庫篩選結果:

用SQL語句删除資料庫重複資料,隻保留一條有效資料

4.删除重複資料,即從重複的資料中,删除掉需要保留資料之外的所有資訊:

SQL:

DELETE 
FROM
	dept 
WHERE
	dname IN ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 過濾出重複的dname
	AND deptno NOT IN ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 過濾出不在需要保留的id之外的所有id
	
           

如果是oracle資料庫,上面的SQL語句可以正常執行,可是換成mysql資料庫,SQL語句執行會報錯:

1093 - You can't specify target table 'dept' for update in FROM clause
           

含義:不能在同一表中查詢的資料作為同一表的更新資料。

适用于mysql資料庫的SQL:

DELETE 
FROM
	dept 
WHERE
	dname IN ( SELECT * FROM ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) a ) 
	AND deptno NOT IN ( SELECT * FROM ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) b )
           

資料庫最後資料:

用SQL語句删除資料庫重複資料,隻保留一條有效資料

到這裡,删除重複資料成功!

一顆安安靜靜的小韭菜。文中如果有什麼錯誤,歡迎指出。

繼續閱讀