学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。

SQL> desc employee

Name                                      Null?    Type

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

emp_id                                                NUMBER(10)

emp_name                                           VARCHAR2(20)

salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:

SQL> select * from employee;

EMP_ID EMP_NAME                                  SALARY

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

1 sunshine                                      10000

1 sunshine                                      10000

2 semon                                         20000

2 semon                                         20000

3 xyz                                           30000

2 semon                                         20000

SQL> select distinct * from employee;

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

2 semon                                         20000

3 xyz                                             30000

SQL>  select * from employee group by emp_id,emp_name,salary having count (*)>1

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

2 semon                                          20000

SQL> select * from employee e1

where rowid in (select max(rowid) from employe e2

where e1.emp_id=e2.emp_id and

e1.emp_name=e2.emp_name and e1.salary=e2.salary);

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

2. 删除的几种方法:

(1)通过建立临时表来实现

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的数据)

SQL> insert into employee select * from temp_emp;  (再将临时表里的内容插回来)

( 2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

SQL>delete from employee e2 where rowid not in (

select max(e1.rowid) from employee e1 where

e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--这里用min(rowid)也可以。

SQL>delete from employee e2 where rowid

select max(e1.rowid) from employee e1 where

e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

e1.salary=e2.salary);

(3)也是通过rowid,但效率更高。

SQL>delete from employee where rowid not in (

select max(t1.rowid) from employee t1 group by

t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

SQL> desc employee

Name                                      Null?    Type

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

emp_id                                                NUMBER(10)

emp_name                                           VARCHAR2(20)

salary                                                  NUMBER(10,2)

可以通过下面的语句查询重复的记录:

SQL> select * from employee;

EMP_ID EMP_NAME                                  SALARY

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

1 sunshine                                      10000

1 sunshine                                      10000

2 semon                                         20000

2 semon                                         20000

3 xyz                                           30000

2 semon                                         20000

SQL> select distinct * from employee;

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

2 semon                                         20000

3 xyz                                             30000

SQL>  select * from employee group by emp_id,emp_name,salary having count (*)>1

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

2 semon                                          20000

SQL> select * from employee e1

where rowid in (select max(rowid) from employe e2

where e1.emp_id=e2.emp_id and

e1.emp_name=e2.emp_name and e1.salary=e2.salary);

EMP_ID EMP_NAME                                     SALARY

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

1 sunshine                                      10000

3 xyz                                             30000

2 semon                                         20000

oracle中的open,Oracle中常用SQL操作相关推荐

  1. ubuntu下mysql语句_Ubuntu安装mysql及常用SQL操作语句

    Ubuntu安装mysql及常用SQL操作语句:安装mysql,在终端运行如下三条命令. sudo apt-get install mysql-server sudo apt-get install ...

  2. oracle wallet java_oracle wallet实践及常用维护操作

    Wallet作用 从Oracle 10g R2开始, 通过使用Oracle Wallet达到任意用户不使用密码登录数据库(非操作系统认证方式), 这对在shell中要使用用户密码登录数据库进行操作的脚 ...

  3. Oracle常用sql操作总结

    一.选择行 1. 简单的SELECT 语句  SELECT 字段名1 [AS] '字段名1 解释' FROM table; 2. 处理NULL  NVL函数可把NULL转换成其它类型的符号  编程技巧 ...

  4. 如何删除表中的重复记录?等等常用SQL语句的积累

    1.如何删除表中的重复记录?(这里指记录的每个字段都要相同) select distinct * into #temp from tab delete tab insert tab select * ...

  5. django项目中涉及到的一些常用sql语句学习整理

    1.  查询数据库中yanfriends_article表中所有的为'201'的cid字段,查询结果按照ctime字段(本身为text,转为int类型比较)的递增展示 select * from ya ...

  6. Hibernate学习之路(十三):Hibernate中的QBC查询和本地sql操作

    什么是hibernate的QBC查询 QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询 ...

  7. 常用sql操作语句实战演示

    本文为原创博客,未经本人允许,禁止将本人的博客复制下来上传到百度文库等平台. 作者:合肥工业大学 管理学院 钱洋 1563178220@qq.com 目录 linux中或cmd中连接数据库 查看库名 ...

  8. Oracle视图添加约束,Oracle创建视图的语法

    Oracle创建视图的语法 导读:就爱阅读网友为大家分享了多篇关于 "oracle 创建序列语法" 资料,内容精辟独到,非常感谢网友的分享,希望从中能找到对您有所帮助的内容. 相关 ...

  9. oracle中sql命令分为几类,常用sql命令@oracle数据类型概括@权限、角色、用户的创建于使用@伪列及其注意事项-Oracle...

    常用sql命令@oracle数据类型概括@权限.角色.用户的创建于使用@伪列及其注意事项 1.各种不同权限的用户 系统权限: 用户名:sys/system(用户名默认的是 sys,system);密码 ...

最新文章

  1. 转:ASP自动解压RAR文件
  2. Java多线程中join方法详解
  3. 二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储
  4. NWERC 2018 C. Circuit Board Design 树 + 构造
  5. Spring Boot应用程序的“本地服务”
  6. java自动加空格吗_程序加上空格和不加空格运行结果不一样
  7. python地图标注_Python 给定的经纬度标注在地图上的实现方法
  8. select下拉框option的样式修改
  9. ASP.NET TextBox 当鼠标点击后清空默认提示文字
  10. MacOS平台上编译 hadoop 3.1.2 源码
  11. d触发器q端的输出波形_如果把D触发器的输出Q'反馈连接到输入D,则输出Q的脉冲波形的频率为CP脉冲频率f的 。...
  12. display:block jquery.sort()
  13. jQuery实现留言板功能
  14. python实战项目分析2—物流
  15. 视频专辑:LAMP兄弟连李明老师2011年新版原创Linux视频教程
  16. 动态规划之完全背包和多重背包
  17. labelme 语义分割数据集_【综述系列】语义分割研究要用到的数据集介绍(一)...
  18. 项目经验介绍的STAR法则--面试
  19. POST http://localhost:8080/admin/getPageDiseaseList net::ERR_INCOMPLETE_CHUNKED_
  20. Outlook邮箱如何在手机上登录

热门文章

  1. [转]频谱、幅度谱、功率谱和能量谱
  2. enabled的使用
  3. TF-IDF原理和使用以及算法详解
  4. 2020年煤矿安全监测监控新版试题及煤矿安全监测监控复审考试
  5. 程序员接私活一定要知道的事情,我走的弯路你们都别走了
  6. 使用vscode pull拉取报错: [rejected] (would clobber existing tag)
  7. 12 JAVA编程思想——集合的类型
  8. 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)
  9. Java任务项目-名片管理系统
  10. Linux-ARM开发