在實際開發中,可能會遇到數據庫多條數據重復了,此時我們需要刪除重復數據,只保留一條有效數據,用SQL語句怎么實現呢,下面我們模擬一下:
1.準備重復數據:
2.過濾出存在重復數據的信息:
SQL語句:
SELECT
dname
FROM
dept
GROUP BY
dname
HAVING
count( dname ) >1
數據庫篩選結果:
3.從重復數據中篩選出一條需要保存的數據:
SQL語句:
SELECT
min( deptno ) -- max( deptno )
FROM
dept
GROUP BY
dname
HAVING
count( dname ) >1
這里使用數據庫的MIN或者MAX函數篩選出一條需要保存數據即可。
數據庫篩選結果:
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 )
數據庫最后數據:
到這里,刪除重復數據成功!
一顆安安靜靜的小韭菜。文中如果有什么錯誤,歡迎指出。






