SQL刪除重復數據只保留一條數據


1、表結構與數據:

CREATE TABLE tablezzl(
id int,
name VARCHAR(255)
);

2、查詢出重復的數據:

SELECT name FROM tablezzl GROUP BY name HAVING COUNT(name)>1

3、查詢出要保留的重復數據:

SELECT MIN(id) ids FROM tablezzl GROUP BY NAME HAVING COUNT(name)>1

4、最終的SQL:

DELETE FROM tablezzl 
WHERE 1=1
    AND `name` in (SELECT * FROM ( (SELECT `name` `names` FROM tablezzl GROUP BY name HAVING COUNT(`name`)>1) ) a)
    AND id not in (SELECT * FROM ( (SELECT MIN(id) ids FROM tablezzl GROUP BY NAME HAVING COUNT(`name`)>1) ) b)

5、補充 : 

  其中這樣寫mysql中不能如下這樣寫:

DELETE FROM tablezzl 
WHERE 1=1
AND `name` in (SELECT `name` `names` FROM tablezzl GROUP BY name HAVING COUNT(`name`)>1) 
AND id not in (SELECT MIN(id) ids FROM tablezzl GROUP BY NAME HAVING COUNT(`name`)>1) 

會報錯:You can't specify target table 'tablezzl' for update in FROM clause,不能在同一表中查詢的數據作為同一表的更新數據,如模塊4的SQL包裝一下就可以解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM