小龙虾的博客
生命的长度是上帝所给予的,但生命的宽度却掌握在我们自己的手中
posts - 82,comments - 205,trackbacks - 0

    有个朋友问我这个问题,我当时想到的办法是建个临时表,将原表中查询到不重复的内容写入临时表,然后把原表中的值全部删除;将临时表内的值再次写入原表。由于还问了oraclo中遇到的这种情况的处理,我就问了一个程序员,她经常使用数据库。她说的方法大体跟我这个办法差不多。但她认为写一段程序会更好。实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。但因为无论是查询还是使用游标都要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万条,用这种方法就很吓人,耗费时间太长了。

很久没有学习数据库了,想看本书呢,在找书的时候发现了这篇文章。感觉这个方法不错。

为了能清楚地表述,首先假设存在一个产品信息表Products,其表结构如下:

CREATE TABLE Products (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)

表中的数据如下:

ProductID

ProductName

Unit

UnitPrice

1

North

Bottole

9.0

2

Chang

Bottole

20.0

2

Chang

Bottole

20.0

3

Anistreed

G

1.0

4

Thu

Kg

2.8

4

Thu

Kg

2.8

4

Thu

Kg

2.8

产品ChangTofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:

第一、    建立一张具有相同结构的临时表

CREATE TABLE Products_temp (

ProductID int,

ProductName nvarchar (40),

Unit char(2),

UnitPrice money

)

 

第二、    为该表加上索引,并使其忽略重复的值

方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图所示。 按照图中圈出来的地方设置索引选项。

  o_200683185051356.jpg

第三、拷贝产品信息到临时表:  insert into Products_temp Select * from Products

此时SQL Server会返回如下提示:

服务器: 消息 3604,级别 16,状态 1,行 1

已忽略重复的键。

它表明在产品信息临时表Products_temp中不会有重复的行出现。

第四、将新的数据导入原表

将原产品信息表Products清空,并将临时表Products_temp中数据导入,最后删除临时表Products_temp

delete Products
insert into Products select * from Products_temp
drop table Products_temp

这样就完成了对表中重复记录的删除。无论表有多大,它的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。

posted on 2006-11-13 19:02 小龙虾 阅读(942) 评论(5)  编辑 收藏 引用 所属分类: 技术感悟

FeedBack:
# re: 在SQL Server中快速删除重复记录
2006-11-14 09:46 | peanut
一、二两步合成一步
select distinct * into #product from product
这样可以省去create和drop的麻烦  回复  更多评论
  
# re: 在SQL Server中快速删除重复记录
2006-11-14 11:36 | 小龙虾
你不觉得你是加了一个过程嘛,你加了一个查找过程。你试一下结果吧,我觉得数据量大的情况应该是我的办法会快些,这就像一个是搜索,一个是排序,可能打的这个比喻不是很贴切。个人的浅见,你可以实际的试一下哪个比较快,然后跟我分享一下结果。还有我认为group by在数据很大的情况尽量少用,分组浪费时间。  回复  更多评论
  
# re: 在SQL Server中快速删除重复记录
2006-11-15 10:01 | peanut
select distinct * into #Products from Products
这句替代你的前三步,昨天不小心还以为只是前两步呢。

具体:
1,select distinct * into #Products from Products
2,delete Products
3,insert into Products select * from #Products

两种办法的机器效率应该是一样的,但这种人工效率高那么一点儿(#Products不用显式create和drop嘛,哇哈哈哈...)

PS:单纯看lz第一步的复制表结构,存在这种办法,值得推荐:
select * into Products_temp from Products where 0=1  回复  更多评论
  
# re: 在SQL Server中快速删除重复记录
2006-11-18 13:29 | 香香
兄弟真羡慕你还能应用数据库,我已经很长时间没看SQL,我觉得现在应该什么都不会了,什么时候再教教我  回复  更多评论
  
# re: 在SQL Server中快速删除重复记录
2006-11-24 13:40 | 小龙虾
唉!说实话还真想教教你。起码是个可以见面的机会。我很想念香香喜喜。唉,想起喜喜我就有点饿。嘿嘿,跟着她总能傻吃一通。  回复  更多评论
  
只有注册用户登录后才能发表评论。
喜欢我的博客吗?