经常有这样一个业务场景,我们在同一张表中有重复的记录,我们要删除重复的记录,这篇文章就是用来解决这个问题的,用的方法是我目前遇到的效率最高的方法(如果有更好的方法欢迎网友提供)。这个方法会用到了rowid,下面简单介绍一下rowid的定义

1、ROWID定义

ROWID:数据库中行的全局唯一地址

对于数据中的每一行,rowid伪列返回行的地址。rowid值主要包含以下信息:

  • 对象的数据对象编号
  • 该行所在的数据文件中的数据块
  • 该行中数据块的位置(第一行是0)
  • 数据行所在的数据文件(第一个文件是1)。该文件编号是相对于表空间。

通常来说,一个rowid值唯一标识数据中的一行。然而,存储在同一聚簇中不同的表可以有相同的rowid。

2、实现的方法

方法一:

DELETE FROM hr.employees
WHERE ROWID IN (SELECT ROWIDFROM (SELECT first_name,last_name,ROWID,ROW_NUMBER() OVER(PARTITION BY first_name,last_name ORDER BY employee_id) AS staff_row --按照保留的唯一字段进行分区,取row_numberFROM hr.employees)WHERE staff_row > 1);

  乍一看,我勒个去,这个是什么东西要,这么难懂!!没关系,下面给您解释一下,就很好懂了。

  针对的是oracle内置的示例用户hr中的employees这张表,我们希望的是first_name和last_name没有重复的项(如果你的业务需要时别的话可以相应的转换,如在成绩表中的学号就是唯一个,就partition by学号),所以对这两个字段进行partition  by

  在子查询的子查询中我们选择的主要目的是rowid和row_number(first_name和last_name只是用来辅助理解加进去的字段);子查询中我们选择了row_number > 1的rowid,这样的话按照first_name和last_name分组中每一个分组只有一条记录没有被选择;最外面的delete就直接把选择出来的rowid进行了删除。至此完成了hr.employees对于first_name和last_name的去重。

  有朋友会说,妈蛋这太难理解了吧!在这种情况下,往往有方法二~~~

方法二:

DELETE FROM hr.employees t1
WHERE t1.ROWID NOT IN (SELECT MIN(t2.ROWID)FROM hr.employees t2GROUP BY t2.employee_id --按照想要唯一保留的字段进行分组);

  这个明显就比方法一好多了,子查询中我们先选除了rowid,然后按照我们想要保留的唯一字段进行分组,并取每组最小的rowid(注意是子查询表的rowid);然后在用not in删除除开最小的rowid以外的所有记录

  怎么样,这个方法是不是瞬间解决并且非常好理解?但是你以为这样就结束了?no no no

方法三:

DELETE FROM hr.employees t1
WHERE t1.rowid > (SELECT MIN(t2.rowid)FROM hr.employees t2WHERE t1.employee_id = t2.employee_id --按照想要唯一保留的字段进行匹配);

  这个方式看起来和方法二差不多,但是想要说的是,他用的是连接,他用的是连接,不敢说连接一定比group by快,但是基本上不会输group by,而且在一般的情况下也是最快的了。而且外层的">"可以用到索引,就是各种快。

  方法也同样说一下,子查询中按照要保留的字段对t1和t2进行关联,然后选择出最小的rowid(注意是子查询表的rowid),然后在外层用">"只保留每个匹配结果最小的一条记录。然后就瞬间删除重复的记录

Oracle用rowid删除同一张表的重复记录相关推荐

  1. oracle 一次删除多张表

    转载自:https://zhidao.baidu.com/question/184478164.html 1.首先要知道要删除的表名,写如下语句: select 'DROP TABLE'||TABLE ...

  2. 删除千万级表中重复记录的办法

    1.   选择候选键,60个字段,应该只用其中几个就可以判断重复了吧.     在候选键的这些字段上建立索引.              CREATE   TRIGGER   tr_历史交易表     ...

  3. 表的插入、更新、删除、合并操作_20_通过表关联删除多张表

    通过表关联删除多张表 需求描述 需求:删除dept表里deptno和temp相同的记录,但数据不可再恢复. 解决方法:这里通过DELETE FROM A,B FROM tableNAME A JOIN ...

  4. Java连接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash

    准备工作 1.创建Java的Maven项目 创建好的目录结构如下: 另外注意junit的版本,最好不要太高,最开始笔者使用的junit4.12的,发现运行的时候会报错.最后把Junit的版本改成4.7 ...

  5. php删除一张表数据的时候 把另一张表的数据也删除,剔除第一张表的数据时,修改第二张表的相关字段的数值...

    删除第一张表的数据时,修改第二张表的相关字段的数值 表xf xf_id vip total 1 1 10 2 1 100 3 2 80 4 3 50 表vip vip jifen 1 1000 2 5 ...

  6. 只知道删除单张表的数据?不知道删除多张表的数据?

    一些废话 可能在某某一天,你在删除表的数据的时候,不想一张表一张表的去删除,想把两个表的数据同时删除:然后你就会去搜索,然后你就很有很有很有很有可能会看到 me 的这篇优质(呸!!!)文章了~ 嗯,没 ...

  7. delete from删除几张表关联和mysql几种连接查询总结

    delete from删除几张表关联和mysql几种连接查询总结 一.delete from删除几张表关联 ① 在多表连接时删除数据(错误删除示例): delete from sys_role_men ...

  8. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  9. sql删除表中重复记录_SQL从SQL表中删除重复行的不同方法

    sql删除表中重复记录 This article explains the process of performing SQL delete activity for duplicate rows f ...

最新文章

  1. InnoDB行格式(compact,redundant)对照
  2. centos 7.1 yum
  3. 学习笔记:二叉搜索树的验证
  4. 就业模拟试题(.NET部分)
  5. pb 更改dropdwonlistbox绑定数据_Blazor 修仙之旅 组件与数据绑定
  6. selenium python 安装
  7. 以下关于程序设计语言的叙述中,不正确的是()【最全!最详细解释!!】
  8. asp.core api 通过socket和服务器通信发送udp_【网络通信】TCP的通信过程
  9. [C++]头文件(Header Files)和命名空间(Namespace)
  10. 解决安装WordCloud出错
  11. SQL 列转行和动态用时间生数据列
  12. 高数 不定积分 欧拉代换
  13. 个人的信用体系(分层体系)调研
  14. Python股票量化学习(1)——股票代码下载
  15. 趣店预制菜爆火背后,是一场慢节奏的长期主义
  16. 头条自媒体运营秘籍,坚持下去你就可以打败90%的人
  17. 冯诺依曼与哈佛结构的区别
  18. CentOS6 安装mist.io
  19. 电子量产工具:输入系统-输入管理单元测试
  20. layui 数据表格的搜索分页功能的实现

热门文章

  1. draggable禁止拖动_通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽...
  2. VC++动态链接库DLL编程深入浅出
  3. 教你直白的理解贝塞尔曲线???
  4. Apache Flink 漫谈系列(06) - 流表对偶(duality)性
  5. 一线互联网企业面试题总结(帮你成功拿到offer)
  6. Swift 面向协议编程 基础篇 (一) 介绍
  7. SQL Server 高可用方案
  8. 自动完成下拉框 Select2 关键字搜索的实例(本地数据与异步获取)
  9. C# 调用其他的动态库开发应注意的问题
  10. Myeclipse启动Tomcat服务器Address already in use: JVM_Bind