`
paulfzm
  • 浏览: 884301 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

mysql 删除重复多余记录

阅读更多

查询及删除重复记录的方法
(一)

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)


5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1


(三)
方法一

declare @max integer,@id integer

declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1

open cur_rows

fetch cur_rows into @id,@max

while @@fetch_status=0

begin

select @max = @max -1

set rowcount @max

delete from 表名 where 主字段 = @id

fetch cur_rows into @id,@max

end

close cur_rows

set rowcount 0

  方法二

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用

select distinct * from tableName

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName

drop table tableName

select * into tableName from #Tmp

drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

select * from #Tmp where autoID in(select autoID from #tmp2)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)
查询重复

select * from tablename where id in (

select id from tablename

group by id

having count(id) > 1

)

分享到:
评论

相关推荐

    mysql中如何去除小数点后面多余的0

    select cast(2.12000 as decimal(9,... 您可能感兴趣的文章:Mysql中存储UUID去除横线的方法解析mysql中:单表distinct、多表group by查询去除重复记录mysql SELECT语句去除某个字段的重复信息MySQL 去除重复数据实例详解

    数据库删除完全重复和部分关键字段重复的记录

    - 创建一个临时表`tmp`,通过`DISTINCT`关键字去除重复记录。 - 删除原始表`tableName`。 - 将临时表`tmp`的数据复制回`tableName`。 - 删除临时表`tmp`。 2. **SQL Server** - 使用`SELECT DISTINCT`语句创建...

    MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)

    然而,仅仅查询重复数据还不够,我们还需要删除多余的记录,仅保留每个重复组中ID最小的那一条。这里要注意的是,MySQL不允许在`DELETE`语句中直接引用被删除的表。因此,我们需要创建一个临时表来存储需要保留的...

    解析mysql中:单表distinct、多表group by查询去除重复记录

    distinct多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效,在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一...

    Mysql删除重复的数据 Mysql数据去重复

    进一步,如果想要找到可以安全删除的重复记录,即保留每个分组中的一条记录,我们可以使用子查询来确定哪些记录是多余的。以下是一个示例: ```sql SELECT t1.* FROM employee t1 WHERE (t1.emp_name) IN ( ...

    mysql查询表里的重复数据方法

    2. 删除多余记录,保留每个`peopleId`的第一个记录: ```sql DELETE FROM people WHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1) AND MIN(id) NOT IN ...

    SQL对冗余数据的删除重复记录只保留单条的说明

    而在Oracle 10g中,每个记录都有一个唯一的`rowid`,可以通过`rowid`来定位并删除重复记录中的多余项: ```sql -- Oracle 10g SELECT * FROM test; SELECT * FROM test GROUP BY id HAVING COUNT(*) > 1; SELECT ...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    2. 删除多余重复记录,保留每个`(peopleId, seq)`最小`rowid`的记录: ```sql DELETE FROM vitae a WHERE (a.peopleId, a.seq) IN ( SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING COUNT(*) > ...

    MySQL处理重复数据的学习笔记

    例如,假设我们要删除所有first_name和last_name相同的多余记录,可以分两步操作: 1. 创建临时表存储不重复数据: ```sql CREATE TEMPORARY TABLE temp_person AS SELECT first_name, last_name FROM person_tbl ...

    使用SQL语句去掉重复的记录【两种方法】

    然后,删除`rn > 1`的行,从而去除重复。 总的来说,选择哪种方法取决于具体场景。对于较小的数据集,`DELETE`结合`NOT IN`可能就足够了。但面对大规模数据,创建临时表或使用窗口函数的方法通常更有效。在实际操作...

    高性能mysql学习笔记

    - **减少多余的行访问**: 在应用程序端进行联接减少了对同一行数据的重复访问。 - **减少网络流量和内存消耗**: 分解联接减少了数据传输量和内存使用。 #### 三、MySQL查询优化器工作原理 MySQL使用基于开销的...

    MySQL面试题目(16个题目)

    * 对 MySQL 数据库去重的关键字是 `SELECT DISTINCT`,可以过滤掉多余的重复记录,仅保留一条记录。 * MySQL 多表连接有左连接、右连接、内连接三种方式,每种连接方式都有其特点和应用场景。 二、索引知识点 * ...

    SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法

    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断  select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二:  ...

    MySQL 数据查重、去重的实现语句

    2. **多余记录的删除**: 如果需要删除多余的重复记录,仅保留`id`最小的记录,可以使用以下语句: ```sql DELETE FROM user WHERE nick_name IN ( SELECT nick_name FROM (SELECT nick_name FROM user GROUP BY...

    JAVA_MySQL篇.pdf

    - **主键**:是表中的一个或一组字段,其值能够唯一标识表中的一条记录,不允许有重复且不能为空。 - **超键**:如果一个字段或一组字段的值可以唯一标识表中的一行,那么它就是一个超键,它可以包含多余的列。 -...

    MySQL DBA高频面试题

    - 主键:唯一标识表中每条记录的字段集合,不可重复,也不能为空。 - 外键:用来与其他表的主键建立联系的字段,表示本表记录和另一张表记录的关联关系。 - 超键:在关系数据库中能够唯一标识元组的属性集,超键...

    2019年BATJ最新面试414道题(含答案解析)MySQL篇.pdf

    - 主键(Primary Key)是表中唯一标识记录的字段或字段组合,不可重复且不允许为空。 - 超键(Super Key)是一个或一组属性,可以唯一标识一个记录,可能包含多余属性。 - 候选键(Candidate Key)是可能的主键,...

    MySQL常见面试题 .docx

    超键可能包含多余的属性。 - **候选键**:候选键是最小的超键,它不包含任何冗余属性,也就是说,候选键是能够唯一标识一条记录的最小属性集合。 - **外键**:外键是一个表中引用另一个表主键的字段,用于建立和...

    1.功能面试问答.pdf

    删除表中的重复记录通常需要结合GROUP BY和HAVING子句以及ROWID(Oracle中的行标识符)来确定并删除多余的记录。 【存储过程和存储函数】 存储过程是预编译的SQL语句集合,存储在数据库中,可以在需要时调用,以...

Global site tag (gtag.js) - Google Analytics