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

去掉表里组合字段重复的记录

 
阅读更多
 

去掉表里组合字段重复的记录

									2003-12 余枫
	
	当设计表的时候没有建组合字段唯一约束,以后需要增加这一约束时,却发现表里已经有了很多重复记录了。
	
	请看看我用的去掉表里组合字段重复的记录方法:
	
	假设原始表名为source_table,字段名1为field_name1,字段名2为field_name2。
	
	(当然稍加修改也可以用到三个及以上组合字段重复的情况)  
	
	第一步: 生成组合字段重复的临时表source_dup_simple
	create table source_dup_simple
	nologging 
	pctfree 1 pctused 99 
	as select field_name1,field_name2,count(0) as num from source_table
	group by field_name1,field_name2 having count(0)>1;


	第二步: 生成组合字段重复的主表里完整记录的临时表source_dup
	create table source_dup 
	nologging 
	pctfree 1 pctused 99 
	as select t1.* from source_table t1,source_dup_simple t2
	where t1.field_name1=t2.field_name1 and t1.field_name2=t2.field_name2;


	第三步: 删去source_dup里的重复记录 
	
	--可选择:保留rowid小的记录
	delete from source_dup a where rowid > (
	select min(rowid) from source_dup b where
	a.field_name1 = b.field_name1 and a.field_name2=b.field_name2);
	commit;
	
	--可选择:保留rowid大的记录
	delete from source_dup a where rowid < (
	select max(rowid) from source_dup b where
	a.field_name1 = b.field_name1 and a.field_name2=b.field_name2);
	commit;
 
 	注意:如果操作一万条以上的记录最好在source_dup的field_name1和field_name2字段上建索引.
 	
 	     如果想按别的删除规则,如保留日期最新的记录:
 	     
 	     --可选择:保留时间字段date_field大的记录
 	     
 	     delete from source_dup a where date_field < (
		select max(date_field) from source_dup b where
		a.field_name1 = b.field_name1 and a.field_name2=b.field_name2);
	     commit;
	     
 	     --可选择:保留时间字段date_field小的记录
 	     
 	     delete from source_dup a where date_field > (
		select min(date_field) from source_dup b where
		a.field_name1 = b.field_name1 and a.field_name2=b.field_name2);
	     commit;

	     如果时间字段上有重复,还需要再次根据rowid来删一次
 	      
	     delete from source_dup a where rowid < (
	        select max(rowid) from source_dup b where
	        a.field_name1 = b.field_name1 and a.field_name2=b.field_name2);
	     commit; 	
	     
	第四步: 删去所有重复组合字段原始表里记录 
	delete from source_table 
	where field_name1||field_name2 in (select field_name1||field_name2 from source_dup_simple);
 	commit;

 	注意:如果操作一万条以上的记录最好在source_table的field_name1和field_name2字段上建索引.

	第五步: 把剩下的没有重复的记录插回原始表 
	insert into source_table select * from source_dup;
 	commit;
分享到:
评论

相关推荐

    如何查出同一张表中字段值重复的记录

    此外,还可以针对特定字段组合进行重复记录的查找与删除,如 `peopleId` 和 `seq` 的组合: - **查找重复记录**: ```sql SELECT * FROM vita_ea WHERE (a.peopleId, a.seq) IN (SELECT peopleId, seq FROM vita_...

    SQL删除表里的重复数据的两种方法

    1. **确定重复字段**:首先,需要确定哪些字段会导致记录重复。在本例中,假设`job_id`和`job_desc`这两个字段一起构成了重复记录的判断依据。 ```sql -- 示例:确定重复记录的字段 SELECT job_id, job_desc ...

    mysql更新一个表里的字段等于另一个表某字段的值实例

    以上这篇mysql更新一个表里的字段等于另一个表某字段的值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:Sql查询MySql数据库中的表名和描述表中...

    delphi读写BLOB字段

    delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段...

    java如何获得数据库表中各字段的字段名

    ### Java如何获得数据库表中各字段的字段名 在Java编程中,经常需要与数据库进行交互,例如查询、更新或删除等操作。其中一项常见需求是获取数据库表中的所有字段名称。这通常在动态生成报表或者需要根据数据库结构...

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

    在一个表中,如果某些字段的值相同,且这些字段被视为识别记录的关键字段,那么这些记录就被认为是重复的。例如,`person`表中有`id`和`name`两个字段,如果多条记录的`id`相同,我们就认为它们是重复记录。 查询...

    用python sqlite3给已经有的表增加字段

    用python sqlite3给已经有的表增加字段。sql语句的写法,表名用自己的,其他的请严格区分大小写,要不然不会成功。

    如何根据表里的一个字段,查出它属于哪张表

    ### 如何根据表里的一个字段,查出它属于哪张表 在数据库管理与开发过程中,经常需要查询某个特定字段所在的表。这对于了解数据结构、进行数据迁移或编写SQL查询时非常有用。本文将详细介绍如何在SQL Server环境中...

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

    MySQL里查询表里的重复数据记录: 先查看重复的原始数据: 场景一:列出username字段有重读的数据 select username,count(*) as count from hk_test group by username having count&gt;1; SELECT username,count

    arcgis自动导入字段:利用模板批量导入字段tbx

    使用arcgis可能常常遇到需要在属性表里添加非常多的字段,遇到这种情况很多人使用连接的方法来解决,但是当需要添加的图层比较多的时候,就十分麻烦,于是我就开发了这款arcgis工具箱。 工具箱有三个功能: 1.从已...

    SAP方丈-ABAP通过表结构查表字段.doc

    SAP 方丈-ABAP 通过表结构查表字段 SAP 方丈是一种基于 ABAP 的编程语言,用于开发 SAP 系统中的应用程序。ABAP 语言是 SAP 公司开发的一种高级编程语言,用于开发 SAP 系统中的应用程序。通过 ABAP 语言,可以对 ...

    PostgreSQL获取表名和字段名

    在PostgreSQL数据库管理系统中,获取表名和字段名是数据库管理员和开发人员日常工作中常见的任务。这有助于了解数据库结构,进行数据操作、查询优化或设计新的应用程序。以下是一些关于如何在PostgreSQL中获取这些...

    sql 删除表中的重复记录

    在数据库管理中,有时会遇到数据表中存在重复记录的问题,这可能会对数据的准确性造成影响。本篇文章将深入探讨如何使用SQL语句来高效地删除这些重复的记录,特别是针对MySQL数据库的情况。 首先,我们需要识别出表...

    SAP各模块字段与表的对应关系

    SAP各模块字段与表的对应关系 SAP系统中,各模块字段与表的对应关系是非常重要的知识点。下面我们将详细介绍每个模块的字段与表的对应关系。 客户模块 在客户模块中,我们可以看到以下几个表: 1. KNA1 - ...

    条件更新查询表中的字段

    点保存时以单据编号为条件,将实际完工日期复制到子窗体列表上的实际完工日期的每行上。

    SAP18种根据屏幕字段找数据表的方法

    ### SAP18种根据屏幕字段找数据表的方法 #### 概述 在SAP系统中,经常需要根据屏幕上的字段定位到相应的后台数据库表。这不仅对于开发人员来说至关重要,对于那些希望深入了解SAP系统内部运作的人来说也同样重要。...

    SQL SERVE根据值查找所在的表和字段

    ### SQL Server根据值查找所在的表和字段 在SQL Server中,有时我们需要找出特定值存在于哪个表的哪个字段中。这通常发生在数据维护、数据分析或数据迁移等场景中,特别是当数据库中有大量表时,手动检查变得非常...

Global site tag (gtag.js) - Google Analytics