需求:当多行tid重复时,保留tid小的的行,其他重复的行删除。
原书数据:
select t.*,t.rowid from test12 t;
TID TNAME TTIME SSEX ROWID
11 12 AAAMP+AAEAAAAC0AAA
111 1a2 AAAMP+AAEAAAAC0AAB
21 2121 2012-11-13 15:30:45 AAAMP+AAEAAAAC0AAC
21 2121 2012-11-13 15:41:18 男 AAAMP+AAEAAAAC0AAD
23 2121 2012-11-13 15:41:31 女 AAAMP+AAEAAAAC0AAE
23 2121 2012-11-13 15:41:48 nv AAAMP+AAEAAAAC0AAF
实现:通过rowid
select s.tid,min(s.rowid) from test12 s,test12 t where t.tid=s.tid group by s.tid;
11 AAAMP+AAEAAAAC0AAA
21 AAAMP+AAEAAAAC0AAC
23 AAAMP+AAEAAAAC0AAE
111 AAAMP+AAEAAAAC0AAB
select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
21 AAAMP+AAEAAAAC0AAD
23 AAAMP+AAEAAAAC0AAF
select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;
21 AAAMP+AAEAAAAC0AAC
23 AAAMP+AAEAAAAC0AAE
删除方法一:成功!
delete test12 t where t.rowid not in (select min(s.rowid) from test12 s where t.tid=s.tid group by s.tid);----如果是保留最大的唯一行,换max即可。
TID TNAME TTIME SSEX ROWID
11 12 AAAMP+AAEAAAAC0AAA
111 1a2 AAAMP+AAEAAAAC0AAB
21 2121 2012-11-13 15:30:45 AAAMP+AAEAAAAC0AAC
23 2121 2012-11-13 15:41:31 女 AAAMP+AAEAAAAC0AAE
删除方法二:失败!
delete test12 t where t.rowid in (select s.rowid from test12 s where s.tid=t.tid and s.rowid>t.rowid);
解:
由于这个例子的特殊性,所以select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
和
select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;可以查询出来正确的结果。
测试:
insert into test12 values(23,'fsf',sysdate,'F');
insert into test12 values(23,'fsf',sysdate,'M');
select t.*,t.rowid from test12 t;
TID TNAME TTIME SSEX ROWID
11 12 AAAMP+AAEAAAAC0AAA
111 1a2 AAAMP+AAEAAAAC0AAB
21 2121 2012-11-13 15:30:45 AAAMP+AAEAAAAC0AAC
21 2121 2012-11-13 15:41:18 男 AAAMP+AAEAAAAC0AAD
23 2121 2012-11-13 15:41:31 女 AAAMP+AAEAAAAC0AAE
23 2121 2012-11-13 15:41:48 nv AAAMP+AAEAAAAC0AAF
23 fsf 2012-11-14 10:09:14 F AAAMP+AAEAAAAC2AAA
23 fsf 2012-11-14 10:11:50 M AAAMP+AAEAAAAC2AAB
错误结果一:
select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
21 AAAMP+AAEAAAAC0AAD
23 AAAMP+AAEAAAAC2AAB
23 AAAMP+AAEAAAAC2AAA
23 AAAMP+AAEAAAAC0AAF
23 AAAMP+AAEAAAAC2AAB
23 AAAMP+AAEAAAAC2AAA
23 AAAMP+AAEAAAAC2AAB
错误结果二:
select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;
21 AAAMP+AAEAAAAC0AAC
23 AAAMP+AAEAAAAC0AAE
23 AAAMP+AAEAAAAC0AAF
23 AAAMP+AAEAAAAC0AAE
23 AAAMP+AAEAAAAC2AAA
23 AAAMP+AAEAAAAC0AAF
23 AAAMP+AAEAAAAC0AAE
由于是比较,两个表,以笛卡尔积的方式,进行对比,取小的rowid(错误二的例子),首选s表的第一行(tid为23第一行)AAAMP+AAEAAAAC0AAE
与t表的第一比较,相等,无结果;与第二行,第三行,第四行(tid为23的四行),均最小,则,有三条结果;然后s表的第二行开始比较,比t表的第一行大,与第二行相等,比第三、四行相等,则有两条结果;然后s表的第三行,再去比较,比t表的第一、二行都大,与第三行相等,比第四行小,所以一条结果;s表第四行比t表第一、二、三行都大,与第四行相等,所以无结果。综上所述,最终结果(无序的)为:
21 AAAMP+AAEAAAAC0AAC
23 AAAMP+AAEAAAAC0AAE
23 AAAMP+AAEAAAAC0AAF
23 AAAMP+AAEAAAAC0AAE
23 AAAMP+AAEAAAAC2AAA
23 AAAMP+AAEAAAAC0AAF
23 AAAMP+AAEAAAAC0AAE
补充:如果要指定删除重复(tid)行为4(N)行以上的,保留最小的行,其他的删除。
则在where后增加rowid not in (select min(rowid) from test12 group by tid having count(*) >4) and tid in (select tid from test12 group by tid having count(*) >4);这种方法更加灵活,可以实现的功能更多。
- 浏览: 28938 次
相关推荐
查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,...
### Oracle删除重复记录性能分析 #### 一、背景与需求 在数据库管理中,经常会遇到数据清理的需求,尤其是在Oracle数据库中处理重复记录时。本文旨在通过对比几种不同的方法来删除Oracle中的重复记录,并分析其...
ORACLE 删除重复数据 在 ORACLE 数据库中,删除重复数据是一项常见的操作。重复数据的存在可能会导致数据不一致、查询效率下降等问题。今天,我们将介绍三种删除重复数据的方法,并对每种方法的执行时间进行比较。 ...
### Oracle删除表中的重复数据方法 在Oracle中删除表中的重复数据,可以采用多种策略,但通常涉及创建一个临时表来保存去重后的数据,然后用这个临时表覆盖原始表。这种方法可以避免直接修改原表带来的风险,确保...
oracle 删除重复数据的几种方法 在 Oracle 中,删除重复的数据是一种常见的操作。delete 操作可以用来删除重复的数据,但是需要根据实际情况选择合适的方法。下面将介绍四种删除重复数据的方法,每种方法都有其优...
这种方法适用于只需要删除重复记录中的某些行的情况。步骤如下: 1. **找出重复的记录**:首先,我们需要找到那些重复的记录。可以通过子查询来实现这一点。 ```sql SELECT age FROM ( SELECT age, COUNT(*) as...
在Oracle SQL中,删除重复数据并保留最新日期的实例是一个常见的数据清理任务,尤其是在具有历史记录或事务数据的数据库中。这个实例展示了如何通过SQL查询有效地处理这种情况。在这个例子中,我们有一个名为`abc`的...
### Oracle查询重复数据与删除重复记录方法 在Oracle数据库中,有时我们需要找出并处理重复的数据。这不仅可以提高数据质量,还能提升查询效率。本文将详细介绍几种常用的查询和删除Oracle数据库中重复记录的方法。...
Oracle 查询重复数据并删除,只保留一条记录 Oracle 是一种关系型数据库管理系统,广泛应用于企业级数据库管理。然而,在实际应用中,数据重复问题经常会出现,例如在资源目录在线编目的资源项子表中存在多条重发...
根据给定的文件标题、描述和部分内容,我们可以深入探讨Oracle数据库中删除重复记录的方法,这对于维护数据完整性和提高系统性能至关重要。以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. ...
### Oracle 下删除重复数据的方法及分析 #### 一、部分字段重复数据的处理 ##### 查询重复数据 在Oracle数据库中,经常会遇到表中存在部分字段重复的情况。为了找到这些重复的记录,我们可以使用以下SQL语句: `...
本文介绍了在Oracle数据库中如何有效识别和删除重复记录的方法。通过对表中的数据进行适当的清理,不仅可以提高数据质量,还能节省存储资源。希望本文能帮助您更好地管理和维护Oracle数据库中的数据。
在Oracle数据库管理中,处理数据冗余和删除重复项是一项重要的任务,这有助于维护数据的完整性和提升查询效率。本文将深入探讨Oracle中删除和处理重复数据的方法,特别是基于提供的内容,我们将详细解析如何通过SQL...
在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...
**ROWID**:在Oracle数据库中,每个表行都有一个唯一的ROWID,它是表行的物理地址。通过比较ROWID,我们可以轻易地找出那些具有相同字段值但不同ROWID的记录,即重复记录。 删除重复记录的SQL语句如下: ```sql ...
根据给定文件中的标题、描述、标签以及部分内容,本文将详细介绍在Oracle数据库中删除重复数据的几种方法。这些方法利用了ROWID、GROUP BY、DISTINCT等关键字来实现数据去重的功能。 ### 1. 使用ROWID进行去重 ...
- **解释**:此查询将返回所有重复行的关键字段组合及其重复次数。 2. **使用ROWID** - **原理**:ROWID是Oracle中用于唯一标识每条记录的一个特殊属性,利用ROWID可以快速定位到具体记录。 - **示例代码**: `...
Oracle 数据库中删除重复数据的方法是一项常见的数据清洗任务,尤其在大数据量的环境中,确保数据的唯一性和准确性至关重要。以下是一些针对不同情况的 Oracle SQL 语句,用于查找和删除重复数据: 1. **根据单个...