sql过滤、删除、表中重复记录语句

文章介绍利用having group by 及各种select in 联合查询来实现的多种不同方法的过滤重复记录的sql语名。
-
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
)

时间: 2024-09-20 08:12:28

sql过滤、删除、表中重复记录语句的相关文章

如何删除表中重复记录?

问题描述 最近项目中遇到了一个需求,即"如何删除表中重复记录,使得所有重复的记录都只保留一行?".在Google了半个小时之后,发现居然没有一个是正常可用的,于是乎只好自己动手写了一个.因为即便是Grails提供了很好的GORM,但是使用SQL仍然不可能完全避免,因此把它共享出来.原文链接:http://www.groovyq.net/node/162 解决方案 解决方案二:你这是广告还是啥的???解决方案三:ding解决方案四:广而告之解决方案五:看了@@顶下解决方案六:帮顶下解决方

Oracle如何删除表中重复记录

Oracle如何删除表中重复记录 1  引言 在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢? 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 2  处理过程 重复的数据可能有这样两种情况:第一种是表中只有某些字段一样,第二种是两行记录完全一样.删除重复记录后的结果也分为2种,第一种是重复的记录全部删除,第二种是重

Oracle 查找与删除表中重复记录的步骤方法_oracle

这时候如果临时表中有重复数据,无论是主键字段businessid有重复,还是一整行有重复都会报出违反唯一主键约束错误. 方法:group by XX having count(*)>1,rowid,distinct,temporary table,procedure 1.查询表中的重复数据a.重复一个字段 b.重复多个字段 c.重复一整行 创建测试表: 复制代码 代码如下: create table cfa (businessid number,customer varchar2(50),bra

MySQL 删除表中重复记录

版本是:5.0.22-community-nt. 1. 为表folder新建一个临时表folder_tmp create table folder_tmp as select * from folder group by serverIp, userId, name, path; 这里根据serverIp, userId, name, path分组之后,表folder_tmp中留下的是主键id靠前的数据 2. 删除原来的表 drop table folder 3. 重命名表 alter tabl

如何查找、删除表中重复的记录

重复 如何查找.删除表中重复的记录软件环境: 1.Windows NT4.0+ORACLE 8.0.42.ORACLE安装路径为:C:\ORANT问题提出: 1.当我们想要为一个表创建唯一索引时,如果该表有重复的记录,则无法创建成功. 方法原理: 1.Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, rowid确定了每条记录是在ORACLE中的哪一个数据文件.块.行上. 2.在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中 那

python删除列表中重复记录的方法

  这篇文章主要介绍了python删除列表中重复记录的方法,涉及Python操作列表的相关技巧,需要的朋友可以参考下 ? 1 2 3 4 def removeListDuplicates(seq): seen = set() seen_add = seen.add return [ x for x in seq if x not in seen and not seen_add(x) ] 希望本文所述对大家的Python程序设计有所帮助.

确定Oracle数据库表中重复记录的方法

作为一个Oracle数据库开发者或者DBA,在实际工作中经常会遇到这样的问题:试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01452:不能创建唯一索引,发现重复记录. 下面我们以表code_ref为例来讨论这个问题及其解决办法. ERROR位于第1行: ORA-01452: 无法 CREATE UNIQUE INDEX:找到重复的关键字 Oracle系统提示不能对表code_ref创建一个唯一索引,因为系统发现表中存在重复的记录.我们必须首先找到表中的重复记录并删除该记录,才可以创

Sql Server里删除数据表中重复记录的例子_MsSql

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代

Sql Server里删除数据表中重复记录的例子

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代