用Oracle的分析函数删除重复的数据,

用Oracle的分析函数删除重复的数据

没有主键(Primary Key)约束保护的表格可能会让重复的数据行被插入进来。查找这种重复数据的传统方式是通过GROUP BY和HAVING关键字进行查询。在根据关键列把数据分组并计算每个组里的行数之后,有一个以上成员的组就是带有重复数据的组。

尽管发现这样的数据行很容易,但是解决这一问题却十分耗时。在Oracle里,独特的ROWID伪列(pseudocolumn)意味着没有两个列是真正一模一样的。你可以总是利用删除(DELETE)查询来参考一个以外的所有ROWID,以便删除所有的重复数据。这非常有效——如果你没有太多的重复数据需要删除的话。而Oracle 9i里引入的分析函数给予了我们一种更简单的方式来进行这种清除工作。

ROW_NUMBER()分析函数与ROWNUM伪列相似的地方在于它们都能够给输出的行编号。但是ROWNUM给出的是整个数据列完整的序列,而ROW_NUMBER会在我们在数据列里定义的每个分区里把编号重新设置回1。这样做的结果是不仅能够很容易就看到哪个组里有多个成员,还能够确切知道需要删除哪个行。

分析查询的格式是:

Functionname (arguments) OVER (PARTITION BY columns ORDER BY columns)

现在让我们假设在创建SCOTT.EMP表格副本的时候出现了错误,所有的行都被输入了两遍。尝试加入一个主键约束会失败,因为数据已经出现了重复。列表A显示了这一过程,为了清楚说明问题,它被分成两个阶段:

Listing A SQL> -- Will you just LOOK at this table? Lots of duplicates!

SQL>

SQL> SELECT empno, ename

FROM emp2

ORDER BY empno;

EMPNO ENAME

---------- ----------

7369 SMITH

7369 SMITH

7499 ALLEN

7499 ALLEN

7521 WARD

7521 WARD

7566 JONES

7566 JONES

7654 MARTIN

7654 MARTIN

7698 BLAKE

7698 BLAKE

7782 CLARK

7782 CLARK

7788 SCOTT

7788 SCOTT

7839 KING

7839 KING

7844 TURNER

7844 TURNER

7876 ADAMS

7876 ADAMS

7900 JAMES

7900 JAMES

7902 FORD

7902 FORD

7934 MILLER

7934 MILLER

28 rows selected.

SQL> -- First step: number the duplicates of each empno

SQL>

SQL> SELECT ROWID, ROW_NUMBER() OVER (PARTITION BY empno ORDER BY empno) rn

FROM emp2;

ROWID RN

------------------ ----------

AAAM1UAAEAAAAGsAAA 1

AAAM1UAAEAAAAGuAAA 2

AAAM1UAAEAAAAGuAAB 1

AAAM1UAAEAAAAGsAAB 2

AAAM1UAAEAAAAGsAAC 1

AAAM1UAAEAAAAGuAAC 2

AAAM1UAAEAAAAGuAAD 1

AAAM1UAAEAAAAGsAAD 2

AAAM1UAAEAAAAGsAAE 1

AAAM1UAAEAAAAGuAAE 2

AAAM1UAAEAAAAGsAAF 1

AAAM1UAAEAAAAGuAAF 2

AAAM1UAAEAAAAGsAAG 1

AAAM1UAAEAAAAGuAAG 2

AAAM1UAAEAAAAGsAAH 1

AAAM1UAAEAAAAGuAAH 2

AAAM1UAAEAAAAGsAAI 1

AAAM1UAAEAAAAGuAAI 2

AAAM1UAAEAAAAGsAAJ 1

AAAM1UAAEAAAAGuAAJ 2

AAAM1UAAEAAAAGsAAK 1

AAAM1UAAEAAAAGuAAK 2

AAAM1UAAEAAAAGsAAL 1

AAAM1UAAEAAAAGuAAL 2

AAAM1UAAEAAAAGsAAM 1

AAAM1UAAEAAAAGuAAM 2

AAAM1UAAEAAAAGuAAN 1

AAAM1UAAEAAAAGsAAN 2

28 rows selected.

SQL> -- Now, use that as an inline view, and select just the dups

SQL> -- We're including the row number, it won't be in the final query

SQL>

SQL> SELECT ROWID, rn

FROM

(SELECT ROWID, ROW_NUMBER() OVER (PARTITION BY empno ORDER BY empno) rn

FROM emp2)

WHERE rn > 1;

ROWID RN

------------------ ----------

AAAM1UAAEAAAAGuAAA 2

AAAM1UAAEAAAAGsAAB 2

AAAM1UAAEAAAAGuAAC 2

AAAM1UAAEAAAAGsAAD 2

AAAM1UAAEAAAAGuAAE 2

AAAM1UAAEAAAAGuAAF 2

AAAM1UAAEAAAAGuAAG 2

AAAM1UAAEAAAAGuAAH 2

AAAM1UAAEAAAAGuAAI 2

AAAM1UAAEAAAAGuAAJ 2

AAAM1UAAEAAAAGuAAK 2

AAAM1UAAEAAAAGuAAL 2

AAAM1UAAEAAAAGuAAM 2

AAAM1UAAEAAAAGsAAN 2

14 rows selected.

SQL> -- Now we DELETE all the rows in that set

SQL>

SQL> DELETE FROM emp2

WHERE ROWID IN

(SELECT ROWID

FROM (SELECT ROWID,

ROW_NUMBER() OVER (PARTITION BY empno ORDER BY EMPNO) rn

FROM emp2)

WHERE rn > 1);

14 rows deleted.

SQL> commit;

Commit complete.

SQL> -- Show the de-dup'ed table

SQL>

SQL> SELECT empno, ename

FROM emp2;

EMPNO ENAME

---------- ----------

7369 SMITH

7521 WARD

7654 MARTIN

7698 BLAKE

7782 CLARK

7788 SCOTT

7839 KING

7844 TURNER

7876 ADAMS

7900 JAMES

7902 FORD

7499 ALLEN

7566 JONES

7934 MILLER

首先是一个分析查询,通过empno行来分区;它使用ROW_NUMBER()给每个分区进行编号。如果没有重复的内容,分区就只有一个行,编号是“1”。但是,如果存在重复,那么它们就会被编上2、3等号码。这个查询还会返回我们用来唯一识别数据行的ROWID。第一个查询然后就被用作另外一个查询的内联视图,这第二个查询使用一个WHERE子句过滤掉“1”行,只返回重复的内容。最后,一个DELETE语句通过第二个查询使用IN操作符来删掉所有的重复内容。

就和所有的大规模DELETE一样,你需要记住的是,最好把想要保留的行(也就是说那些ROW_NUMBER为1的行)保存到一个新的表格里。INSERT所造成的负载要比DELETE小得多。

http://www.htsjk.com/teradata/32101.html

www.htsjk.Com

true

http://www.htsjk.com/teradata/32101.html

NewsArticle

用Oracle的分析函数删除重复的数据, 用Oracle的分析函数删除重复的数据 没有主键(Primary Key)约束保护的表格可能会让重复的数据行被插入进来。查找这种重复数据的传统方式是通过GRO...

本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.

同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。

相关文章

暂无相关文章

oracle删除重复字段数据库,用Oracle的分析函数删除重复的数据,相关推荐

  1. 案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表

    Oracle数据库在没有备份情况下在对表中的某数据表进行truncate删除后,通过oracle dul进行非常规恢复 1.准备oracle dul测试环境 SQL> select count( ...

  2. oracle dul误删数据,案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表...

    Oracle数据库在没有备份情况下在对表中的某数据表进行truncate删除后,通过oracle dul进行非常规恢复 1.准备oracle dul测试环境SQL> select count(* ...

  3. oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...

    Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link) 有没有办法只通过数据库链接而不是当前会话的数据提交在表上插入/更新的 ...

  4. oracle移除字段默认值,Oracle——增加修改删除字段

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 例:alter table ...

  5. oracle schema与mysql_Oracle数据库之Oracle 11g R2 用户与模式(schema)

    本文主要向大家介绍了Oracle数据库之Oracle 11g R2 用户与模式(schema),通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 创建用户的语法: Create u ...

  6. oracle静默安装访问数据库慢,Oracle数据库静默安装总结

    说到静默安装,就不得不提到响应文件,就是所谓的response file.在oracle,db2的安装中都有提供响应文件,这个响应文件其实就是一 在学习数据库的时候,不知道dbca的命令用了多少遍,但 ...

  7. 如何批量删除mysql的数据库_如何快速批量删除Mysql数据库中的数据表

    一个mysql数据库中,是可以同时安装几个网站程序的,在使用中,我们只需要用不同的数据库表前缀来区分就可以了.但随着我们不断调试,那么数据 库中的表,就会一天天的多起来,如一个一个的删除就很麻烦.很辛 ...

  8. oracle删除查询的数据库语句,Oracle简略的语句 查询 删除 修改(1)

    Oracle简单的语句 查询 删除 修改(1) Dual系统表介绍 数据类型: 数据是信息数字表现形式,信息的加工处理是以大量的结构化数据为载体进行的,数据库管理系统的核心是数据库,数据库的主要对象是 ...

  9. oracle使一个字段自增,Oracle数据库实现一个字段自增

    对于SQL SERVER数据库实现字段自增比较简单,可以之间使用函数:identity(),例如我们在建表时可以这样实现: create table tbRentInfo( sID int ident ...

最新文章

  1. std::string的find问题研究
  2. 【做事必须搞清10个顺序】
  3. kettle于javascript步骤错误处理
  4. java怎么复制别人的数据库_java-如何在不使用Apache DDLUtils的情况下使用JDBC将模式从一个数据库复制到另一个数据库?...
  5. autoLayout自动布局
  6. 2021快手电商数据报告
  7. hadoop--HDFS搭建客户端API环境
  8. Kubernetes Pod入门指南
  9. Cmake-cmake_minimum_required()
  10. go语言 slice
  11. 机器学习基础(十一)—— Logistic Regression 梯度更新公式的推导
  12. mysql百万级数据测试_百万级数据mysql测试环境介绍
  13. rzsz的编译安装及SecureCR下Zmodem传输用法
  14. LTE系统调试记录12:接收端画星座图
  15. 【Nginx】关于二级域名配置https
  16. Python实现手机号归属地查询
  17. 2021 Macbook Pro 14 频繁问题回答
  18. 试用MarkDown标记法和Haroopad编辑器
  19. python将电视剧按收视率进行排序_怎么用编程语言分析电影收视率_编程语言_python_python教程_课课家...
  20. Java程序员能不了解Oracle吗?

热门文章

  1. java中如何返回四维数组_如何从Java中的方法返回数组?
  2. RPM部署MYSQL
  3. 【转】AndroidStudio升到最新版本(3.1.2)之后
  4. 优秀的弹窗插件 jquery.lightbox_me.js
  5. Uva 10557 XYZZY
  6. 查询SQL的null与''
  7. 事半功倍系列之javascript (转载)
  8. python函数求导_python_exp
  9. MyBatis学习笔记(一):MAVEN的下载,安装与环境配置和在IDEA中配置maven
  10. google protobuf windows下环境配置