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),branchcode varchar2(10),data_date varchar2(10)); insert into cfa values (1,'Albert','SCB','2011-11-11'); insert into cfa values (2,'Andy','DB','2011-11-12'); insert into cfa values (3,'Allen','HSBC','2011-11-13'); ---------------以下为重复数据---------------------------------------------- insert into cfa values (1,'Alex','ICBC','2011-11-14'); insert into cfa values (1,'Albert','CTBK','2011-11-15'); insert into cfa values (1,'Albert','SCB','2011-11-11');
对于a的情况,只有businessid重复
select * from cfa where businessid in (select businessid from cfa group by businessid having count(businessid)>1);
如果是b的情况,businessid 和name同时存在重复
select * from cfa where (businessid,customer) in (select businessid,customer from cfa group by businessid,customer having count(*)>1);
对于c的情况,重复一整行
参考b的方法:
select * from cfa where (businessid,customer,branchcode,data_date) in (select * from cfa group by businessid,customer,branchcode,data_date having count(*)>1);
2、删除表中的重复数据
a情况,删除表中多余的重复记录,重复记录是根据单个字段(businessid)来判断,只留有rowid最小的记录
也可以只保留rowid不是最小记录,需要把代码中的min改为max这里不再赘述。
delete from cfa where businessid in (select businessid from cfa group by businessid having count(businessid) > 1) and rowid not in (select min(rowid) from cfa group by businessid having count(businessid) > 1);
或者,使用下面更简单高效的语句
DELETE FROM cfa t WHERE t.ROWID > (SELECT MIN(X.ROWID) FROM cfa X WHERE X.businessid = t.businessid);
b情况,删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from cfa where (businessid,customer) in (select businessid,customer from cfa group by businessid,customer having count(*) > 1) and rowid not in (select min(rowid) from cfa group by businessid,customer having count(*) > 1);
或者,使用下面更简单高效的语句
DELETE FROM cfa t WHERE t.ROWID > (SELECT MIN(X.ROWID) FROM cfa X WHERE X.businessid = t.businessid and x.customer = t.customer);
c情况,这种情况就比较简单,使用临时表方法
create table cfabak as select distinct * from cfa; truncate table cfa;--如果是生产最好对该表backup Insert into cfa select * from cfabak; commit;
相关推荐
- Oracle 查寻与删除表中重复记录的步骤方法
- Mybatis面试题 MyBatis 编程步骤 MyBatis 的工作原理 mybatis功能架构 为什么使用预编译 Mybatis 的Xml 映射文件中, 不同的Xml映射文件, id是否可以重复? Mybatis 是如何将sql 执行结果封装为目标对象并返回的?都有哪些映射形式? Mybatis 是否可以映射Enum 枚举类? MyBatis 如何执行批量插入? Mybatis 是如何进于分页的?分页插件的原理是什么? 模糊查询like 语句该怎么写? #{}和${}的区别是什么? 当实体类中的属性名和表中的字段名不一样, 怎么办? 通常一个Xml 映射文件, 都会写一个Dao 接口与之对应,请问, 这个Dao 接口的工作原理是什么? Dao 接口里的方法,参数不同时, 方法能重载吗? Mybatis 是如何将sql 执行结果封装为目标对象井返回的?都有哪些映射形式? 在mapper 中如何传递多个参数? Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么? mybatis缓存 使
- 去掉Oracle表中特定重复记录的步骤
- MySQL数据库实用技巧 1、如何快速掌握MySQL? 2、如何选择服务器的类型? 3、如何选择存储引擎 4、如何查看默认存储引擎? 5、表删除操作须谨慎 6、每个表中都要有一个主键吗? 7、每个表都可以任意选择存储引擎吗? 8、带AUTO_INCREMENT约束的字段值是从1开始的吗? 9、TIMESTAMP与DATATIME两者的区别 10、选择数据类型的方法和技巧是什么? 11、MySQL中如何使用特殊字符? 12、MySQL中可以存储文件吗? 13、MySQL中如何执行区分大小写的字符串比较? 14、如何从日期时间值中获取年、月、日等部分日期或时间值? 15、如何改变默认的字符集? 16、DISTINCT可以应用于所有的列吗? 17、ORDER BY可以和LIMIT混合使用吗? 18、什么时候使用引号? 19、在WHERE子句中必须使用圆括号吗? 20、更新或者删除表时必须指定WHERE子句吗? 21、索引对数据库性能如此重要,应该如何使用它? 22、尽量使用短索引。 23、MySQL存储
- Oracle 查找与删除表中重复记录的步骤方法
- Oracle PL/SQL-如何删除SQL表中的多个重复记录?
- Oracle 查找与删除表中重复记录的步骤方法
- Oracle数据库剔除表中重复记录的常见方法
- 韩顺平Oracle笔记 1. Oracle认证和安装,与其他数据库比较 2. Oracle的基本使用--基本命令 3. oracle用户管理 4. oracle表的管理(数据类型,表创建删除,数据 CRUD操作) 5. oracle表查询(1) 6. oracle表查询(2) 7. java操作oracle 8. oracle中事务处理 9. oracle的函数 10. 数据库管理,表的逻辑备份与恢复 11. 数据字典和动态性能视图 12. 数据库管理 -- 管理表空间和数据文件 13. 约束 14. Oracle索引、权限 15. 角色 16. PL/SQL 块的结构和实例 17. pl/sql分类 -- 过程,函数,包,触发器 18. 定义并使用变量,复合类型 19. pl/sql的进阶--控制结构(分支,循环,控制) 20. PL/SQL分页 21. 例外处理 22. oracle的视图
- Oracle数据库删除两表中相同数据的方法
- 一个synergy辅助工具:在synergy服务端远道地启动客户端
- :怎么收缩数据库中未用的表空间