不管是在測試中還是面試中,總是會遇到這種場景,某個數據表中的數據存在重復,要求刪除重復數據時,保留一行。接下來,我給大家演示一下,如何寫出符合要求的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之后,我的問題完美的解決了,刪除了重復數據的同時,保留了一條記錄。