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

  • 相关阅读:
    Flink 读取 Kafka 数据 (极简版)
    自动化测试模型
    C语言字符串处理库函数大全(转)
    c语言笔记
    c语言的自动类型转换(转)
    itest(爱测试)开源接口测试&敏捷测试管理平台8.1.0发布
    itest(爱测试)开源接口测试&敏捷测试&极简项目管理 8.0.0 发布,测试重大升级
    工控机折腾小记
    linux
    华为交换机服务端策略路由配置
  • 原文地址:https://www.cnblogs.com/jane4321/p/13154673.html
Copyright © 2011-2022 走看看