当前位置: 首页 > news >正文

sql删除冗余数据

工作或面试中经常能遇见一种场景题:删除冗余的数据,以下是举例介绍相应的解决办法。

  • 举例:
    • 表结构:
      在这里插入图片描述
    • 解法1:子查询
      获取相同数据中id更小的数据项,再将id不属于其中的数据删除。
      -- 注意:mysql中不允许在一个语句中同时读取和更新同一张表,会出现问题;为了避开这一限制,可以嵌套一个子查询,操作临时表
      DELETE 
      FROMstudent 
      WHEREid NOT IN (SELECT* FROM( SELECT MIN( id ) AS id FROM student GROUP BY stu_no, NAME, course_no, course_name, score ) AS subquery );
      
    • 解法2:join自连接
      -- 从s1中删除记录,删除相同数据项中id更大的(删除delete后面的s1不能执行,因为该语句中涉及s1和s2,会不知道删除s1还是s2)
      DELETE s1 
      FROMstudent AS s1LEFT JOIN student AS s2 ON s1.stu_no = s2.stu_no AND s1.`name` = s2.`name` AND s1.course_no = s2.course_no AND s1.course_name = s2.course_name AND s1.score = s2.score 
      WHEREs1.id > s2.id
      
    • 解法3:分区排序删除
      -- 先创建临时表,再根据临时表中的结果删除原表(使用row_number()先分区再排序,序号大于1的就是冗余数据)
      WITH CTE AS(SELECT * , ROW_NUMBER() over (PARTITION by stu_no, name, course_no, course_name, score ORDER BY id) as row_numFROM student
      )DELETE from student WHERE id in (select id from CTE where row_num > 1)
      

以上为个人学习分享,如有问题,欢迎指出:)

http://www.lryc.cn/news/498368.html

相关文章:

  • STM32-C语言基础知识
  • 【Point-LIO】基于Ubuntu20.04的ROS1平台的Point-LIO部署Mid-360激光雷达
  • 02_Node.js模块化
  • 网络——HTTP与HTTPS三次握手和四次挥手
  • ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统
  • 开发知识点-uniCloud
  • Redis——主从复制原理
  • MATLAB数学建模之画图汇总
  • Milvus attu - docker 使用 及 版本兼容
  • okHttp的tcp连接池的复用
  • nginx 自启动失败:Failed to parse PID from file: Invalid argument
  • Wwise SoundBanks内存优化
  • centos 常见问题处理
  • 简述Vue每个周期具体适合哪些场景?
  • Alibaba Druid(简称Druid)
  • linux protobuf的安装与使用
  • 关于Chrome自动同步书签的解决办法
  • 基于深度学习的甲状腺结节影像自动化诊断系统(PyQt5界面+数据集+训练代码)
  • docker常用操作命令
  • Android:生成Excel表格并保存到本地
  • JVM-程序计数器与栈
  • 【kotlin 】内联类(value class / inline class)
  • 【SpringBoot】使用IDEA创建SpringBoot项目
  • C++设计模式(原型、代理、适配器、组合)
  • 如何在CentOS 7上使用FreeIPA设置集中式Linux身份验证
  • vue2播放视频和预览文件的组件以及使用方法
  • 性能之巅:Go语言优化深度探索
  • react + antd desgin 使用form功能时upload,radio,checkbox不能回显的问题
  • 【08】MySQL复杂查询:子查询语句详解与示例
  • Unity 相机旋转及角度限制