学习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