有个朋友问我这个问题,我当时想到的办法是建个临时表,将原表中查询到不重复的内容写入临时表,然后把原表中的值全部删除;将临时表内的值再次写入原表。由于还问了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
|
产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:
第一、
建立一张具有相同结构的临时表
CREATE TABLE Products_temp (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)
第二、
为该表加上索引,并使其忽略重复的值
方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图所示。
按照图中圈出来的地方设置索引选项。
第三、拷贝产品信息到临时表: 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) 编辑 收藏 引用 所属分类:
技术感悟