-
2021-08-24 16:32:17更多相关内容
-
【mysql】mysql删除重复记录并且只保留一条
2018-09-03 21:10:13目录 一、单个字段的操作 分组介绍: 1. 查询全部重复的数据: 2. 删除全部重复试题: ...4. 删除表中多余重复试题并且只留1条: a. 第一种方法: b. ☆第二种方法(与上面查询的第二种方法对应,只...目录
3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)
b. ☆第二种方法(与上面查询的第二种方法对应,只是将select改为delete):
最近在做题库系统,由于在题库中添加了重复的试题,所以需要查询出重复的试题,并且删除掉重复的试题只保留其中1条,以保证考试的时候抽不到重复的题。
首先写了一个小的例子:
一、单个字段的操作
这是数据库中的表:
分组介绍:
Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1
查看是否有重复的数据:
GROUP BY <列名序列>
HAVING <组条件表达式>
查询出:根据dname分组,同时满足having字句中组条件表达式(重复次数大于1)的那些组
count(*)与count(1) 其实没有什么差别,用哪个都可以
count(*)与count(列名)的区别:
count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)
1. 查询全部重复的数据:
Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)
2. 删除全部重复试题:
将上面的查询select改为delete(这样会出错的)
DELETE FROM dept WHERE dname IN ( SELECT dname FROM dept GROUP BY dname HAVING count(1) > 1 )
会出现如下错误:[Err] 1093 - You can't specify target table 'dept' for update in FROM clause
原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作
解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。
3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)
a. 第一种方法:
SELECT * FROM dept WHERE dname IN ( SELECT dname FROM dept GROUP BY dname HAVING COUNT(1) > 1 ) AND deptno NOT IN ( SELECT MIN(deptno) FROM dept GROUP BY dname HAVING COUNT(1) > 1 )
上面这种写法正确,但是查询的速度太慢,可以试一下下面这种方法:
b. 第二种方法:
☆根据dname分组,查找出deptno最小的。然后再查找deptno不包含刚才查出来的。这样就查询出了所有的重复数据(除了deptno最小的那行)
SELECT * FROM dept WHERE deptno NOT IN ( SELECT dt.minno FROM ( SELECT MIN(deptno) AS minno FROM dept GROUP BY dname ) dt )
c. 补充第三种方法(根据评论区给的删除总结出来的):
SELECT * FROM table_name AS ta WHERE ta.唯一键 <> ( SELECT max( tb.唯一键 ) FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 );
4. 删除表中多余重复试题并且只留1条:
a. 第一种方法:
DELETE FROM dept WHERE dname IN ( SELECT t.dname FROM ( SELECT dname FROM dept GROUP BY dname HAVING count(1) > 1 ) t ) AND deptno NOT IN ( SELECT dt.mindeptno FROM ( SELECT min(deptno) AS mindeptno FROM dept GROUP BY dname HAVING count(1) > 1 ) dt )
b. ☆第二种方法(与上面查询的第二种方法对应,只是将select改为delete):
DELETE FROM dept WHERE deptno NOT IN ( SELECT dt.minno FROM ( SELECT MIN(deptno) AS minno FROM dept GROUP BY dname ) dt )
c. 补充第三种方法(评论区推荐的一种方法):
DELETE FROM table_name AS ta WHERE ta.唯一键 <> ( SELECT t.maxid FROM ( SELECT max( tb.唯一键 ) AS maxid FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 ) t );
二、多个字段的操作:
单个字段的如果会了,多个字段也非常简单。就是将group by 的字段增加为你想要的即可。
此处只写一个,其他方法请仿照一个字段的写即可。
DELETE FROM dept WHERE (dname, db_source) IN ( SELECT t.dname, t.db_source FROM ( SELECT dname, db_source FROM dept GROUP BY dname, db_source HAVING count(1) > 1 ) t ) AND deptno NOT IN ( SELECT dt.mindeptno FROM ( SELECT min(deptno) AS mindeptno FROM dept GROUP BY dname, db_source HAVING count(1) > 1 ) dt )
总结:
其实上面的方法还有很多需要优化的地方,如果数据量太大的话,执行起来很慢,可以考虑加优化一下:
- 在经常查询的字段上加上索引
- 将*改为你需要查询出来的字段,不要全部查询出来
- 小表驱动大表用IN,大表驱动小表用EXISTS。IN适合的情况是外表数据量小的情况,而不是外表数据大的情况,因为IN会遍历外表的全部数据,假设a表100条,b表10000条那么遍历次数就是100*10000次,而exists则是执行100次去判断a表中的数据是否在b表中存在,它只执行了a.length次数。至于哪一个效率高是要看情况的,因为in是在内存中比较的,而exists则是进行数据库查询操作的
本人小菜一枚,有什么写的不妥的地方,欢迎大家指教!
我会不定期的看评论,也会根据大家的指点来修改博客不妥的地方!
各位读者有什么好的方法,或者想法欢迎评论区留言。。。
-
【PgSQL】- 删除完全重复的数据(连id都一样)仅保留一条
2019-10-10 15:11:41目录写在前面一、场景描述二、问题分析三、解决思路四、具体步骤1.环境说明2.创建表/初试化数据3.查看表数据4.清洗数据5.查看表数据五、总结六、参考资料写在后面 一、场景描述 最近接手了一个老项目,在分析...写在前面
写这篇文章的
目的是因为在删除重复数据时,遇到了Pg数据库delete语句后面不支持limit关键字
。本文适应于有一定工作经验且有SQL基础的同学。
一、场景描述
最近接手了一个老项目,在分析存储过程的时候,发现Pg数据库中有一张配置表出现了
完全相同(所有字段,连id都一样)
的数据。其结果造成前端页面展示时,下拉框出现了重复值。那么面临的问题,很显然就是如何删除重复的数据?
二、问题分析
常规思路:数据重复了,那我把多余的查出来,删了不就完事儿了,开始写sql。首先group by,通过having count(*) > 1的,找到重复数据的id(本文中的这个场景,id值也重复);然后 DELETE FROM table WHERE id = ? LIMIT ?;
select * from table group by ... having count(*) > 1; delete from table where id = ? limit ?;
但是,在执行delete 语句时报错了,错误是
ERROR: syntax error at or near "limit"
。经资料查询,MySQL支持delete后面加limit ,而PgSQL 在update/delete后面均不支持limit。 怎么搞?!注意:数据无价,更新删除操作前,请先备份数据。
三、解决思路
由于行记录没有唯一属性,既然在当前表中不能直接操作数据,那么我就先建立一张临时表,把去除重复发后的数据取出来放到临时表中。然后删除原表中的数据,再把临时表中的数据倒腾回去,最后删除临时表。下面,用一个简单的例子演示一下。
四、具体步骤
1.环境说明
名称 说明 数据库版本 PostgreSQL 12.3 2.创建表/初试化数据
CREATE TABLE code ( id CHARACTER VARYING(255) ); INSERT INTO code VALUES (1), (2), (3), (4), (3), (4), (1), (1);
3.查看表数据
SELECT * FROM code;
4.清洗数据
CREATE TABLE temp ( id CHARACTER VARYING(255) ); INSERT INTO temp SELECT * FROM code WHERE id NOT in ( SELECT id FROM code GROUP BY id HAVING COUNT(*) > 1 ) UNION SELECT * FROM code GROUP BY id HAVING COUNT(*) > 1; TRUNCATE TABLE code; INSERT INTO code SELECT * FROM temp; DROP TABLE temp;
5.查看表数据
SELECT * FROM code;
五、总结
出现以上的问题,根源在于表结构在最初设计时没有考虑唯一约束,导致多人维护出现数据重复,
因此在建表时,一定要建主键或者唯一索引保证记录的唯一性。
六、参考资料
写在后面
如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。
-
MYSQL实现分组排序并取组内第一条数据
2020-12-22 01:27:20一、需要实现分组排序并且取组内状态优先级最高的数据有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据第一种写法:select t.* from (select e.* from error_record e where e.status >...一、需要实现分组排序并且取组内状态优先级最高的数据
有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据
第一种写法:
select t.* from (
select e.* from error_record e where e.status > 0 and e.error_type > 0 order by
) t group by t.error_type
这个写法无法实现我们的需求, 原因是MySQL分组查询时默认按照id从小到大的顺序排列让我们自定义的排序失效了
第二种写法:
select t.* from (
select e.* from error_record e where e.status > 0 and e.error_type > 0 order by e.status limit 1000
) t group by t.error_type
这个写法可以实现我们的需求, 在临时表内部排序时用limit字段固定排序, 然后在临时表外分组就可以改变group by默认排序的问题(注: 原表中error_typ为3的数据只有一条就是status: 2)
sql语句 查询分组后的每组的第一条或最后一条数据
select * from(select row_number() over(partition by IDCARD order by DATATM desc) as rownum,* from (S ...
sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算,主表与附表一对多取唯一等
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了row ...
SQL分组排序后取每组最新一条数据的另一种思路
在hibernate框架和mysql.oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据. 之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条 ...
MySQL分组排序(取第一或最后)
MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...
oracle分组取每组第一条数据
oracle分组后取每组第一条数据 '数据格式 分组取第一条的效果 [sql] SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY ...
mssql sqlserver 使用sql脚本获取群组后,按时间排序(asc)第一条数据的方法分享
摘要: 下文讲述使用sql脚本,获取群组后记录的第一条数据业务场景说明: 学校教务处要求统计: 每次作业,最早提交的学生名单下文通过举例的方式,记录此次脚本编写方法,方便以后备查,如下所示: 实现思路 ...
Oracle分组取第一条数据
看看曾经的私密日志.原来自己之前被非常多小而简单的问题困惑过. 看着那时候我们还是新手中的新手做的备忘笔记! 事实上就是用了Oracle的统计函数而已! 曾经的日记(看样子应该是曾经公司的源代码,呵呵 ...
oracle 根据字段分组取第一条数据及rank函数说明
当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...
随机推荐
Apache Cordova开发Android应用程序——番外篇
很多天之前就安装了visual studio community 2015,今天闲着么事想试一下Apache Cordova,用它来开发跨平台App.在这之前需要配置N多东西,这里找到了一篇MS官方文 ...
b/s结构的物业管理系统(一)-------登录篇
最近计划做一个非框架的物业管理系统前端使用bootstrap js jquery 等希望各位指点一下共同学习 ---前端登录页面------ 这个页面的输入框组用的bootstrap的,我设置了几张背 ...
SSE入门
此文主要内容来自这篇文章,本文翻译只求能理解,不求逐句翻译. 正文: 我们将在本文中介绍如何在C++/C中使用SSE指令.我的目的不是用SSE写尽可能快的程序,而是试图讲明白它的使用方法. 什么是SS ...
POJ3318--Matrix Multiplication 随机化算法
Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? In ...
(转载)OC学习篇之---类目的概念和使用
上一篇文章介绍了OC中的@class关键字的使用,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首 ...
Android 使用WakeLock
为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU.WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态. ...
【 js 基础 】 深浅拷贝
underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...
Cheat sheet for Jupyter Notebook
近期,DataCamp发布了jupyter notebook的 cheat sheet,[Python数据之道]第一时间与大家一起来分享下该cheat sheet的内容. 以下是该cheat shee ...
洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
由于需要对网络设备做备份,备份文件是放到windows机器上的.现在需要将备份数据同步到linux备份机器上,想到的方案有三种: 1)将windows的备份目录共享出来,然后在linux服务器上进行挂 ...
-
Mysql三:一条SQL在MySQL中是如何执行的
2022-04-25 12:36:44文章目录一条SQL在MySQL中是如何执行的1、连接器2、查询缓存3、分析器4、优化器5、执行器6、bin-log归档 一条SQL在MySQL中是如何执行的 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括... -
sql中如何取重复的数据中时间最近的一条
2021-02-23 09:51:05数据库有重复的数据时,我们有时候需要取出时间最近的一条,来满足业务场景。 下面介绍一下通过sql是怎么实现的。 提示:以下是本篇文章正文内容,下面案例可供参考 一、数据准备 1. 表结构 CREATE TABLE `t_iov_... -
【解决】在同一个word文档不同部分添加多个目录
2022-02-11 20:07:28本文是一项针对办公软件word的解决方案,即在某些时候我们会遇到在同一个word文档中不同章节添加目录的情况。比如一个同事发来的 刚遇到此情况也是比较纠结,后来顺利解决了,具体策略如下: 文档格式 ... -
Mybatis 关于同一条SQL语句实现批量插入和更新(SaveOrUpdate)完整版
2020-01-07 21:01:11文章目录一、 根据相应的唯一主键来判断是否新增或更新 [对事务支持较好]二、根据selectkey判断查询的count值是否为1,然后再进行新增或更新 前言:我们在做批量更新或者插入时候,不想在代码中写sql查询数据库,... -
执行一条sql语句update多条记录实现思路
2016-06-21 09:30:38本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: 复制代码 代码如下: UPDATE mytable SET myfield='value' ... -
在“绝世武功的目录”RTR4中译版出版前,先奉上“绝世武功秘籍的本体”
2021-10-08 18:37:30本文由@浅墨_毛星云 出品,转载请注明出处 ... ...本文提供了图形学全网学习资料的“半壁江山”——《Real-Time Rendering 4th》2000多份参考文献合集的开源Github Repo地址,以及更新了RTR4中译... -
好东西都在这里,不点下看看吗(博客目录导航,持续更新中...)
2020-11-29 17:42:40他说一条河流的水量,是由河流的长度、深度和宽度这三个因素决定的,而一个人的影响力也是如此。 我们每个人都会在意自身的影响力,因为影响力是我们幸福感和满足感的来源之一。我们自己感觉到的幸福感来源是多种... -
遇到种种坑,启动logstash直接shutdown,或者启动了es只有一条数据等等
2020-04-03 17:41:10其实原因很简单,就是为了减少mysql的压力,比如说我现在业务需要查一个看课历史,这个看课历史总是导致慢sql或者同一时间总是调用很多,导致mysql的cpu总是很高,这个时候就可以使用logstash将数据同步到es中,直接... -
Linux基本命令汇总 - 持续更新
2021-05-08 21:40:18Linux基本命令汇总 一、Linux管理文件和目录的命令点击如下标题,会自动跳转到该命令详解 ~1、pwd命令2、cd命令3、ls命令4、cat命令5、grep命令6、touch命令7、cp命令8、mv命令9、rm命令10、vi命令11、dd命令一、... -
(PDF目录)自动生成PDF书签目录
2020-10-30 10:37:12手动指定特定的标题样式,然后利用PDF补丁丁软件,自动匹配并生成PDF书签目录。哦吼,起飞!从此快人一步! -
sql update实现一个表中的数据更新另一个表中的数据
2019-05-15 08:53:43一下把一个表搞的数据乱了,只得恢复数据库重新替换过来,可能是where条件没有写好。 update A SET A.cj = b.cj FROM A ,B WHERE A.Name = B.Name 然后根据自己平时积累写下了如下代码,自己可以验证,风险... -
Linux常用命令系列——文件和目录操作命令(ls)
2021-05-14 21:02:09文章目录:1.语法2.选项3.参数4.实例4.1 显示当前目录下非隐藏文件与目录4.2显示当前目录下包括隐藏文件在内的所有文件列表4.3 输出长格式列表4.4列出文件和文件夹的详细信息4.5显示文件的inode信息4.6水平输出文件... -
漫谈一条SQL语句的一生
2020-03-20 11:32:26一个默默无闻的垂钓者 --- 来自城管副队长小王 前言 其实,在我们程序员看来,写SQL就像吃饭一样稀松平常。从前,公司大神(侨总)对我说过:"知道么,我写过的SQL比你吃过的米都多"。这句话让我看到了我与他... -
解决word生成目录-页码-字体问题
2019-10-25 12:02:592.word从正文第一页开始自动生成目录 1.word独立生成目录页码 (1). 一般而言,我们写好的文档会是这样的 (2). 给文档的各级标题添加 标题样式 ,根据需要设置的标题等级依次选用不同的样式。 首先添加”一级标题... -
【MySQL】 update 大量数据批量更新
2021-04-20 11:18:09文章目录更新字段,多种操作更新一条数据的某个字段,一般这样写:更新同一字段为同一个值,mysql也很简单,修改下where即可:更新多条数据为不同的值,可能很多人会这样写:那么能不能一条sql语句实现批量更新呢?... -
word自动生成目录如何从正文第一页开始
2017-03-20 16:49:433.在你的正文第一页,双击页脚,取消“链接到前一条页眉”;然后,页码--设置页码格式,选择“起始页码”--确定。 你会发现此时页码从正文的第一页开始了,然后,单击目录,重新生成即可。(此时目录的页码已经和... -
如何更新word文档中的文献引用编号?
2022-02-07 14:37:54一、问题提出你是否有这样的烦恼: (1)几十条,甚至上百条的论文参考文献顺序变动了,需要手动输入和更新论文中每条引用的编号? (2)硬…https://zhuanlan.zhihu.com/p/86899123目录 1、引用文献 2、编号同步 ... -
MongoDB 数据更新操作
2019-03-11 20:14:46目录 MongoDB 更新文档 update() 方法 实例 各种更新操作符 "$set" "$set" 与 "." 操作 "$unset" "$inc" "$rename" "$pop" &... -
oracle应用之批量新增更新数据
2019-05-12 00:11:12本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 (1)命令窗口... -
【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
2016-01-29 13:08:01没错,我目前打算写一本关于Unity Shader的书。出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴。我非常明白学Shader的艰难,在群里也见了很多人提出的问题。我觉得学习Shader还是一件... -
Cordova热更新(一、流程与原理篇)
2018-05-07 20:42:38最近需要上线app,所以需要对cordova热更新的整个流程整理下,防止出现问题,项目的结构大致如下:一个是vue开发的工程叫Vue-mobile,一个是cordova打包app的工程叫Cordova-appVue-mobile工程:Cordova-app工程:... -
2015年最新Android基础入门教程目录(完结版)
2015-11-23 20:48:122015年最新Android基础入门教程目录(完结版) 前言: 关于《2015年最新Android基础入门教程目录》终于在今天落下了帷幕,全套教程 共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享 ... -
MySQL事务之丢失更新问题
2019-05-05 19:41:53在事务的并发操作中,也就是多个事务同时对同一组数据进行...比如,事务A 修改了一条记录,事务B 在 事务A 提交的同时也进行了一次修改并且提交。当事务A查询的时候,会发现刚才修改的内容没有被修改,好像丢失了更新。 -
-
论文参考文献引用和自动更新方法
2021-03-01 10:57:53需要利用“交叉引用”对“参考文献”以“[a]”、“[a,b]”、“[a-b]”、“[a,b-d]”、“[a-c,e]”等格式实现单个或连续多个文献引用,该方法使得在删除或增加参考文献条目后,文献引用能够自动更新。 一、设置参考... -
关于Git这一篇就够了
2021-05-12 12:56:18目录 前言 发展过程 集中式与分布式的区别 Debian/Linux安装Git 配置git环境:git config --global 创建本地空仓库:git init 新建文件添加到本地仓库:git add、git commit -m 改写提交:git commit --...