• 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之后,我的问题完美的解决了,删除了重复数据的同时,保留了一条记录。

  • 相关阅读:
    九.GPIO中断试验3——GPIO中断驱动
    十.定时器EPIT——1EPIT的入门
    九.GPIO中断试验1——中断原理
    九.GPIO中断试验2——通用中断服务程序构成
    Django学习笔记〇六——项目2,图书管理系统
    博客项目——〇六 添加新文章——富文本编辑器、beautifulsoup的使用
    1月7日
    1月9日
    1月8日
    Scala泛型和上下界
  • 原文地址:https://www.cnblogs.com/jane4321/p/13154673.html
Copyright © 2020-2023  润新知