原文連結 http://t.zoukankan.com/c-Ajing-p-13448349.html
在實際開發中,可能會遇到資料庫多條資料重複了,此時我們需要删除重複資料,隻保留一條有效資料,用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 )
資料庫最後資料:
到這裡,删除重複資料成功!
一顆安安靜靜的小韭菜。文中如果有什麼錯誤,歡迎指出。