当前位置:  数据库>oracle

解决Oracle删除重复数据只留一条的方法详解

    来源: 互联网  发布时间:2014-09-07

    本文导语:  查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where  Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来...

查询及删除重复记录的SQL语句
1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断
select * from 表 where  Id in (select Id from 表 group by Id having count(Id) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录
DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) > 1);

3、查找表中多余的重复记录(多个字段)
select * from 表 a
where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from 表 a
where (a.Id,a.seq) in   (select Id,seq from 表 group by Id,seq having count(*) > 1)
and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from 表 a
where (a.Id,a.seq) in   (select Id,seq from 表 group by Id,seq having count(*) > 1)
and rowid not in (select min(rowid) from 表 group by Id,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
)


    
 
 

您可能感兴趣的文章:

  • HTML <!DOCTYPE> 标签用法详解及如何解决<!DOCTYPE html>未声明时导致页面无效的问题
  • 解决C++中事件不响应的方法详解
  • 探讨:sql插入空,默认1900-01-01 00:00:00.000的解决方法详解
  • 解决无法在unicode和非unicode字符串数据类型之间转换的方法详解
  • 解决C++ 无法从void 转换为LRESULT的方法详解
  • 解决plsql连接失败,弹出空白提示框的方法详解
  • 解决MyEclipse6.5无法启动,一直停留刚开始启动界面的详解
  • C++中用substr()函数消除前后空格的解决方法详解
  • 基于ORA-12170 TNS 连接超时解决办法详解
  • 解决Fedora14下eclipse进行android开发,ibus提示没有输入窗口的方法详解
  • windows环境中mysql忘记root密码的解决方法详解
  • 深入分析WPF客户端读取高清图片卡以及缩略图的解决方法详解
  • 解决C# winForm自定义鼠标样式的两种实现方法详解
  • SQL实现递归及存储过程中In()参数传递解决方案详解
  • 解决Android SDK下载和更新失败的方法详解
  • 解决常见的Eclipse SVN插件报错方法详解
  • 解决C#程序只允许运行一个实例的几种方法详解
  • 解决在eclipse中将android项目生成apk并且给apk签名的实现方法详解
  • MySQL死锁问题分析及解决方法实例详解
  • 基于Java内存溢出的解决方法详解
  • 求子数组最大和的解决方法详解
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • 删除文件,求解决
  • vsftpd中怎么解决用户删除权限阿?
  • javascript开源软件 iis7站长之家
  • 安装SQL2008时提示删除SQL2005Express工具的解决方法
  • 安装完jbuilder无法创建工程(在root用户下),如何解决,如何删除安装?
  • 设置了alias以后重新登录就没有了,怎么解决呢?设什么权限可以删除文件?
  • oracle怎么删除用户提供解决方案
  • SqlServer 2005 无法删除维护计划的解决办法
  • MySQL 删除大表的性能问题解决方案
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • secureCRT下Linux终端汉字乱码解决方法
  • 实现在同一方法中获取当前方法中新赋值的session值解决方法
  • andriod中UIScrollView无法正常滚动的解决方法
  • 解决 select 挡住div的解决方法
  • vs2010下禁用vmware的方法以及解决vmware插件导致vs2010变慢的问题
  • GET方法URL中传递中文参数乱码的解决方法
  • windows server2008上PowerBuilder程序系统错误解决方法
  • asp.net post方法中参数取不出来的解决方法
  • Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  • MYSQL安装时解决要输入current root password的解决方法
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 解决oracle用户连接失败的解决方法
  • 多jdk环境下安装多个tomcat冲突解决配置方法
  • 呵呵,前段时间Ubuntu服务器版的问题总算解决了,解决方法就是重新安装桌面版-_-!
  • Andriod上ANR介绍及ANR问题解决方法
  • chrome下jq width()方法取值为0的解决方法
  • JQuery给元素绑定click事件多次执行的解决方法
  • ftp连接出现socket错误=#10054的解决方法
  • Provider错误80004005终极解决方法(完全有效的方法)
  • mysql修改用户密码的方法和mysql忘记密码的解决方法
  • 浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • VS2005解决方案管理器中不显示解决方案节点的解决办法
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 有高手能破解RAR的密码吗,至今没有找到人能解决?(先只给10分意思意思,若解决,至少给解决的人500分!说话算话!)
  • window.onload事件覆盖掉body onload事件(window.onload和html body onload事件冲突)解决办法
  • 奇怪,怎么“已解决”问题只有4页(10/17日之后的),以前的已解决问题到哪里看?
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 解决!解决!求助如何安装多系统!
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • 解决多级索引速度慢的问题可否像解决多级页表那样使用TLB?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3