快速删除ORACLE重复记录
时间:2007-12-23 来源:不详 作者:迈克DB
SQL>descemployee
NameNull?Type
emp_idNUMBER(10)
emp_nameVARCHAR2(20)
salaryNUMBER(10,2)
可以通过下面的语句查询重复的记录:
SQL>select*fromemployee;
EMP_IDEMP_NAMESALARY
1sunshine10000
1sunshine10000
2semon20000
2semon20000
3xyz30000
2semon20000
SQL>selectdistinct*fromemployee;
EMP_IDEMP_NAMESALARY
1sunshine10000
2semon20000
3xyz30000
SQL>select*fromemployeegroupbyemp_id,emp_name,salaryhavingcount(*)>1
EMP_IDEMP_NAMESALARY
1sunshine10000
2semon20000
SQL>select*fromemployeee1
whererowidin(selectmax(rowid)fromemployee2
wheree1.emp_id=e2.emp_idand
e1.emp_name=e2.emp_nameande1.salary=e2.salary); 本文来自织梦
EMP_IDEMP_NAMESALARY
1sunshine10000
3xyz30000
2semon20000
2.删除的几种方法:
(1)通过建立临时表来实现
SQL>createtabletemp_empas(selectdistinct*fromemployee)
SQL>truncatetableemployee;(清空employee表的数据)
SQL>insertintoemployeeselect*fromtemp_emp;(再将临时表里的内容插回来)
(2)通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。
SQL>deletefromemployeee2whererowidnotin(
selectmax(e1.rowid)fromemployeee1where
e1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameande1.salary=e2.salary);--这里用min(rowid)也可以。
SQL>deletefromemployeee2whererowid<(
selectmax(e1.rowid)fromemployeee1where
e1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameande1.salary=e2.salary);
内容来自dedecms
(3)也是通过rowid,但效率更高。
SQL>deletefromemployeewhererowidnotin(
selectmax(t1.rowid)fromemployeet1groupbyt1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。
EMP_IDEMP_NAMESALARY
1sunshine10000
3xyz30000
2semon20000
文章评论
共有位Admini5网友发表了评论 查看完整内容