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

翻译|其它|编辑:郝浩|2008-05-08 10:20:42.000|阅读 935 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

       重复记录分为两种,第一种是完全重复的记录,也就是所有字段均重复的记录,第二种是部分关键字段重复的记录,例如Name字段重复,而其它字段不一定重复或都重复。

  1、第一种重复很容易解决,不同数据库环境下方法相似:

以下为引用的内容:
Mysql

 create table tmp select distinct * from tableName;

 drop table tableName;

 create table tableName select * from tmp;

 drop table tmp;

SQL Server

 select distinct * into #Tmp from tableName;

 drop table tableName;

 select * into tableName from #Tmp;

 drop table #Tmp;

Oracle

 create table tmp as select distinct * from tableName;

 drop table tableName;

 create table tableName as select * from tmp;

 drop table tmp;

  发生这种重复的原因是由于表设计不周而产生的,增加唯一索引列就可以解决此问题。

  2、此类重复问题通常要求保留重复记录中的第一条记录,操作方法如下。 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

Mysql

 以下为引用的内容:
 alter table tableName add autoID int auto_increment not null;

 create table tmp select min(autoID) as autoID from tableName group by Name,Address;

 create table tmp2 select tableName.* from tableName,tmp where tableName.autoID = tmp.autoID;

 drop table tableName;

 rename table tmp2 to tableName;

SQL Server

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

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

 drop table tableName;

 select * into tableName from #Tmp where autoID in(select autoID from #Tmp2);

 drop table #Tmp;

 drop table #Tmp2;

Oracle

 DELETE FROM tableName t1 WHERE t1.ROWID > (SELECT MIN(t2.ROWID) FROM tableName t2 WHERE t2.Name = t1.Name and t2.Address = t1.Address);

说明:

  1. MySQL和SQL Server中最后一个select得到了Name,Address不重复的结果集(多了一个autoID字段,在大家实际写时可以写在select子句中省去此列)

  2. 因为MySQL和SQL Server没有提供rowid机制,所以需要通过一个autoID列来实现行的唯一性,而利用Oracle的rowid处理就方便多了。而且使用ROWID是最高效的删除重复记录方法。
标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:赛迪网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP