Oracle快速删除重复记录
在这方面,总结了重复记录的删除方法和每种方法的优缺点。
为了便于报告,这表叫Tbl,在表三列col1,col2,COL1,COL2和col3,COL1,COL2是主键,添加到索引。
1。通过创建一个临时表
可以先将数据导入临时表,然后删除原始表的数据,然后将数据返回到原始表,SQL语句如下所示:
创建表tbl_tmp(选择重复的任务表);任务型教学; / /插入任务选择空表记录* tbl_tmp; / /临时表中的数据插入后。
这种方法可以达到要求,但显然,对于110百万级的表,这种方法是非常缓慢的。在生产系统中,给系统带来很大的费用,是不可行的。
2。使用ROWID
在Oracle中,每个记录有一个rowid和rowid是独一无二的数据库。rowid确定哪些数据文件、块和行是每个Oracle。在重复记录,所有列的内容可能是相同的,但rowid会不一样。SQL语句如下:
删除从TBL在rowid在(选择a.rowid从TBL,TBL)
如果您已经知道每条记录只有一个副本,则应用此SQL语句。但是如果每个记录的重复记录有n且n未知,则应考虑以下方法。
三.使用马克斯函数或min函数
rowid也用在这里,这是不同于MAX或MIN函数,SQL语句如下
从任务型教学在rowid不删除(选择最大(b.rowid)从TBL在哪里a.col1 = b.col1和a.col2 = b.col2); / /最大最小也可以用在这里。
或使用以下语句
从任务型教学在rowid 删除
它与上面的思维方式基本相同,但使用组可以减少显性比较条件,提高效率:
deletefrom TBL在rowid不在(选择最大(rowid)从TBL T的t.col1 t.col2,删除);(col1,col2)任务,在(SELECT col1,col2从tblgroup bycol1 col2havingcount(*)> 1(selectnin)rowidnotin(rowid)fromtblgroup bycol1 col2havingcount(*)> 1)
还有一个更适合用更少的记录重复记录的表和索引方法。假定col1,col2有一个索引,并有较少的记录重复记录的表表,SQL语句是4,使用组来提高效率