数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

在SQL中删除重复记录(多种方法)


发布日期:2018年06月29日
 
在SQL中删除重复记录(多种方法)

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

SQL> desc employee

NameNull?Type

emp_idNUMBER()

emp_name VARCHAR()

salaryNUMBER()

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

SQL> select * from employee;

EMP_ID EMP_NAMESALARY

sunshine

sunshine

semon

semon

xyz

semon

SQL> select distinct * from employee;

EMP_ID EMP_NAME SALARY

sunshine

semon

xyz

SQL>select * from employee group by emp_idemp_namesalary having count (*)>

EMP_ID EMP_NAME SALARY

sunshine

semon

SQL> select * from employee e

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

where eemp_id=eemp_id and

eemp_name=eemp_name and esalary=esalary);

EMP_ID EMP_NAME SALARY

sunshine

xyz

semon

删除的几种方法

)通过建立临时表来实现

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

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

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

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

SQL>delete from employee e where rowid not in (

select max(erowid) from employee e where

eemp_id=eemp_id and eemp_name=eemp_name and esalary=esalary);这里用min(rowid)也可以

SQL>delete from employee e where rowid <(

select max(erowid) from employee e where

eemp_id=eemp_id and eemp_name=eemp_name and

esalary=esalary);

)也是通过rowid但效率更高

SQL>delete from employee where rowid not in (

select max(trowid) from employee t group by

temp_idtemp_nametsalary);这里用min(rowid)也可以

EMP_ID EMP_NAME SALARY

sunshine

xyz

semon

SQL> desc employee

NameNull?Type

emp_idNUMBER()

emp_name VARCHAR()

salaryNUMBER()

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

SQL> select * from employee;

EMP_ID EMP_NAMESALARY

sunshine

sunshine

semon

semon

xyz

semon

SQL> select distinct * from employee;

EMP_ID EMP_NAME SALARY

sunshine

semon

xyz

SQL>select * from employee group by emp_idemp_namesalary having count (*)>

EMP_ID EMP_NAME SALARY

sunshine

semon

SQL> select * from employee e

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

where eemp_id=eemp_id and

eemp_name=eemp_name and esalary=esalary);

EMP_ID EMP_NAME SALARY

sunshine

xyz

semon

删除的几种方法

)通过建立临时表来实现

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

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

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

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

SQL>delete from employee e where rowid not in (

select max(erowid) from employee e where

eemp_id=eemp_id and eemp_name=eemp_name and esalary=esalary);这里用min(row

上一篇:oracle字符集问题,登陆sqlplus出现问号

下一篇:Oracle基本数据类型存储格式浅析(一)-字符类型