河南新华电脑学院
欢迎 游客 , 注册 | 登录 | 会员 | 界面 | 简洁版本 | 在线 | 帮助
河南新华电脑学院

发表新主题 回复该主题
本主题被查看799次, 共3个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: SQL中的一些小技巧
hufangyuan
管理员
UID: 1
来自:
精华: 10
积分: 472
帖子: 402
注册: 2006-10-19 13:36:00
状态: 离线
威望: 20.00
金钱: 113.49 元
只看楼主 2007-08-19 22:03
SQL中的一些小技巧
Oracle快速删除重复的记录
【IT168 技术文档】做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而且是生产系统。也就是说,不能把所有的记录都删除,而且必须快速的把重复记录删掉。
    对此,总结了一下删除重复记录的方法,以及每种方法的优缺点
    为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,col2上加了索引。
    1、通过创建临时表
    可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:

    creat table tbl_tmp (select distinct* from tbl);
    truncate table tbl;//清空表记录
    insert into tbl select * from tbl_tmp;//将临时表中的数据插回来

这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。

2、利用rowid
    在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:

  delete from tbl where rowid in (select a.rowid from tbl a,
tbl b where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2)

如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。
    3、利用max或min函数
    这里也要使用rowid,与上面不同的是结合max或min函数来实现。SQL语句如下:

delete from tbl a where rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);
//这里max使用min也可以

或者用下面的语句
    delete from tbl a where rowid < (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里如果把max换成min的话,前面的where子句中需要把"<"改为">"
    跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。SQL语句如下:

  delete from tbl
          where rowid not in (
                        select max(rowid) from tbl t group by t.col1, t.col2 );

delete from tbl
          where (col1, col2) in (
                    select col1,col2 from tbl
                                  group by col1,col2 having count(*) > 1) and
                                  rowid not in (
                                            select nin(rowid)from tbl group by col1,col2 having count(*) > 1)

还有一种方法,对于表中有重复记录的记录比较少的,并且有索引的情况,比较适用。假定col1,col2上有索引,并且tbl表中有重复记录的记录比较少,SQL语句如下4、利用group by,提高效率



hufangyuan 最后编辑于 2007-08-20 14:45:47
#1  
hufangyuan
管理员
UID: 1
来自:
精华: 10
积分: 472
帖子: 402
注册: 2006-10-19 13:36:00
状态: 离线
威望: 20.00
金钱: 113.49 元
只看楼主 2007-08-20 14:46
回复:SQL中的一些小技巧
自己顶一下
#2  
猪猪很乖
新手上路
UID: 50
来自: 河南
精华: 0
积分: 15
帖子: 15
注册: 2007-8-27 11:03:37
状态: 离线
威望: 0
金钱: 2.85 元
2007-08-30 10:47
回复:SQL中的一些小技巧
(*^__^*) 嘻嘻……自己顶多孤单。。。。参加一份

知错悔改还是好孩子!
#3  
发表新主题 回复该主题
本主题被查看799次, 共3个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2008-12-04 13:29:26

版权所有 河南新华电脑学院  
          1.0.2642 (RC2)   Copyright © 2001-2008 Comsenz Inc.
Processed in 0.352 seconds