MySQL中刪除重復數據時保留一行


不管是在測試中還是面試中,總是會遇到這種場景,某個數據表中的數據存在重復,要求刪除重復數據時,保留一行。接下來,我給大家演示一下,如何寫出符合要求的SQL語句。

1、首先,創建一個數據表SC,建表語句如下:

CREATE TABLE sc (
id INT PRIMARY KEY auto_increment,
SNO VARCHAR(3) NOT NULL,
CNO VARCHAR(5) NOT NULL,
DEGREE NUMERIC(10, 1) NOT NULL
);

2、接着插入一些數據,這些數據中有一部分是重復的。

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);

3、查詢SC表中的重復數據

SELECT SNO,CNO ,COUNT(*)
FROM sc
GROUP BY sno,cno
HAVING COUNT(*)>1;

顯示結果如下:

 

 4、刪除重復數據,寫了如下SQL語句:

DELETE FROM sc WHERE sno in(
SELECT SNO
FROM sc
GROUP BY sno,cno
HAVING COUNT(*)>1);

運行時,發現報錯,具體報錯信息如下:

 

 也就是說,在同一張表上不能在統計查詢的時候,進行刪除操作。

那么,我就想到了命名別名的方式,避免這個問題,於是寫了如下SQL

DELETE FROM sc
WHERE sno in(SELECT sno FROM (SELECT sno
FROM sc
GROUP BY sno,cno
HAVING COUNT(*)>1)as a);

運行之后,重復數據刪除了,但是全部刪除了,沒有保留數據,而我的本意是在刪除重復數據的時候,希望保留一條記錄的,於是在上面的SQL語句基礎上做了完善,具體SQL語句如下:

DELETE FROM sc
WHERE sno in(SELECT sno FROM (SELECT sno
FROM sc
GROUP BY sno,cno
HAVING COUNT(*)>1)as a)
and ID not in(SELECT MIN(id)FROM
(SELECT id FROM sc GROUP BY sno,cno
HAVING COUNT(sno)>1)b );

這么寫了SQL之后,我的問題完美的解決了,刪除了重復數據的同時,保留了一條記錄。


免責聲明!

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



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