怎样删除数据库中的反复记录?

一、题外篇

今天非常悲催啊,给用户数据做datapatch的时候,每一个月的数据多导入了一份,瞬间惊出一身冷汗... 这但是产品环境,要是被老板知道了可就死定了。赶紧去掉反复的记录,同一时候写下以下的文章以备后用。

二、准备篇

1. 先创建一张学生表student:

create table student(
       id varchar(10) not null,
       name varchar(10) not null,
       age number not null
);

2. 插入几条数据到表student:

insert into student values(‘1‘, ‘zhangs‘, 20);
insert into student values(‘1‘, ‘zhangs‘, 20);
insert into student values(‘2‘, ‘zhangs‘, 20);
insert into student values(‘3‘, ‘lisi‘, 20);
insert into student values(‘4‘, ‘lisi‘, 30);
insert into student values(‘5‘, ‘wangwu‘, 30);

三、处理篇

1. 使用rowid

① 查询:

select *
  from student s1
 where rowid != (select max(rowid)
                   from student s2
                  where s1.id = s2.id
                    and s1.name = s2.name
                    and s1.age = s2.age)

注: rowid是唯一标志记录物理位置的一个id, 括号里是查询出反复数据中rowid最大的一条.

② 删除:

delete from student s1
 where rowid != (select max(rowid)
                   from student s2
                  where s1.id = s2.id
                    and s1.name = s2.name
                    and s1.age = s2.age)

2. 使用 group by 和 having

① 查询:

select id, name, age, count(*)
  from student
 group by id, name, age
having count(*) > 1;

② 删除:

delete from student
 where rowid in (select min(rowid)
                   from student
                  group by id, name, age
                 having count(*) > 1)

3. 使用distinct

create table stud_temp as select distinct * from student; -- 创建暂时表 stud_temp
truncate table student; -- 清空student表
insert into student select * from stud_temp; -- 将暂时表数据导入student表
drop table stud_temp; -- 删除暂时表

注: distinct仅仅适用于对小表处理, 假设是千万级别数据的表, 请使用rowid, 由于它具有唯一性, 效率更高.

时间: 2024-10-05 05:31:14

怎样删除数据库中的反复记录?的相关文章

如何删除数据库中的重复记录?

一.题外篇 今天很悲催啊,给用户数据做datapatch的时候,每个月的数据多导入了一份,瞬间惊出一身冷汗... 这可是产品环境,要是被老板知道了可就死定了,赶紧去掉重复的记录,同时写下下面的文章以备后用. 二.准备篇 1. 先创建一张学生表student: create table student( id varchar(10) not null, name varchar(10) not null, age number not null ); 2. 插入几条数据到表student: ins

【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录

介绍 晚上无聊的时候,我做了一个測试题,測试题的大体意思是:删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录. 比如: I have a map with duplicate values: ("A", "1"); ("B", "2"); ("C", "2"); ("D", "3"); ("E", "

GridView RowDeleting 动态添加行,删除行记录 不删除数据库中记录

如果只需删除GridView中的行, 并不删除数据库中的记录 项次 工号 姓名   1 10022936 gracy.ma 删除 2 10017300 eric.mak 删除 protected void Button1_Click(object sender, EventArgs e)        {            int rowCount = 1;            DataTable DT = new DataTable();            DataRow DR;  

统计一个数据库中,无记录的表的sql语句

2016-05-20 SQL Server数据库中统计无记录数的表 大家使用的时候,将sql脚本中的红色[TestDB] 换成你的目标数据库名称. 1 /************************************************************ 2 * Code formatted by SoftTree SQL Assistant ?v7.0.158 3 * Time: 2016/5/19 18:47:02 4 * Author:zhangcn 5 *******

MySQL 删除数据库中重复数据(以部分数据为准)

delete from zqzrdp where tel  in (select min(dpxx_id) from  zqzrdp  group by tel  having count(tel)>1); 执行,报错 异常意为:你不能指定目标表的更新在FROM子句.傻了,MySQL 这样写,不行,让人郁闷. 难倒只能分步操作,蛋疼 以下是网友写的,同样是坑爹的代码,我机器上运行不了. 1. 查询需要删除的记录,会保留一条记录.  代码如下 复制代码 select a.id,a.subject,

sqlserver删除数据库中所有的表

sqlserver删除数据库中所有的表 ------------------------------------------------------------------------------------------- 打开Sql server management studio并新建一个查询,在打开的XXX.SQL文件中输入: exec sp_MSforeachtable @command1='Delete from ?' exec sp_MSforeachtable @command1

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

MySQL删除数据库中所有表方法

MySQL删除数据库中所有表方法技术 maybe yes 发表于2015-01-23 12:16 原文链接 : http://blog.lmlphp.com/archives/66  来自 : LMLPHP后院 通过使用 CONCAT 函数将数据库表名称和需要执行的 SQL 语句连接起来,输出在控制台:然后从控制台复制这些内容,粘贴,执行,OK.table_schema 条件为需要操作的数据库名称,参考 SQL 语句如下: SELECT CONCAT('DROP TABLE IF EXISTS 

Java之——删除ArrayList中的反复元素的2种方法

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47414935 ArrayList是Java中最经常使用的集合类型之中的一个.它同意灵活加入多个null元素,反复的元素,并保持元素的插入顺序.在编码时我们经常会遇 到那种必须从已建成的ArrayList中删除反复元素的要求.这篇文章将给出两种从ArrayList中删除反复元素的方法. 方法1:使用HashSet删除ArrayList中反复的元素 在该方法中.我们使用HashSet