在SQL Server中快速删除重复记录

上一篇 / 下一篇  2008-04-08 19:12:12 / 个人分类:数据库

数据库

聂霞发布于 2007-08-29 15:00:52

3h9h7vPT0

%HqE1S#}:db7M0SQL Server中快速删除重复记录(多图)

;Ez-]!q A ]0

n$bt2eACr6w3l051Testing软件测试网/~"PRa8KW(Z z_
文/夏翔   51Testing软件测试网C6qZ9a"f:_,p
51Testing软件测试网1~ oA!n*o,w]O
        开发人员的噩梦——删除重复记录51Testing软件测试网s }(CO}
51Testing软件测试网YOX,C;lw`wZ2r0p
  想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确。解决该问题的办法就是将这些重复的记录删除,只保留其中的一条。
!_ `:r+J g~+}y0
L+_VihRFN0  在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。因为这种方法需要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间。51Testing软件测试网#m:Wr*m8l,S

%})]6T'i#xj0  四板斧——轻松消除重复记录
!D l G!NYEh{0
9A\ k#P NsF0  殊不知在SQL Server中有一种更为简单的方法,它不需要用游标,只要写一句简单插入语句就能实现删除重复记录的功能。为了能清楚地表述,我们首先假设存在一个产品信息表Products,其表结构如下:51Testing软件测试网/O Qs9}|(mPK-bU
51Testing软件测试网?(xYO[|u6\?$V

CREATE TABLE Products (
7eV,yh WKt0ProductID int,51Testing软件测试网U#{Udf'MOu Z h
ProductName nvarchar (40),51Testing软件测试网 K9A*{+sGiGT
Unit char(2),51Testing软件测试网Z_ J1Kq*m
UnitPrice money51Testing软件测试网LAw~'X"a
)

ia8B1`;tp0  表中的数据如图1:
!|C2WH)}^3A`9Z051Testing软件测试网 t7k/mJ;]r d]p
在SQLServer中快速删除重复记录(多图)51Testing软件测试网}1m*b0i#}#[ m:K
图表
51Testing软件测试网lMPv Jz-]9@8z
  图1中可以看出,产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:
BV qiKO ^D ~B w051Testing软件测试网7Q#r-EZLd#Lm
  第一板斧——建立一张具有相同结构的临时表51Testing软件测试网 jS[2ru3B6Ow3`9p5[*X

RJ#Al]+j0
CREATE TABLE Products_temp (51Testing软件测试网!Y,H:a E"^ n E Z
ProductID int,51Testing软件测试网*Zt p3R'z2\!B
ProductName nvarchar (40),
Z K8[G _o6BM1m0Unit char(2),
'r*|%n(S6Zx7P}d0UnitPrice money
~3E6]sx!d'G0)

2\(^-Ltq8z*Q+Uo0  第二板斧——为该表加上索引,并使其忽略重复的值
wqz{,j,\051Testing软件测试网N0^ `,O Hb ]9x3x
  方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图2所示。
uGP)}OUq051Testing软件测试网/mX2Q5\.X V
  按照图2中圈出来的地方设置索引选项。51Testing软件测试网s0p K5iEA

/V:ML\KA&e sU0
在SQLServer中快速删除重复记录(多图)
^T.oK:T-GY h-~0图2

1U nAD:q1C0  第三板斧——拷贝产品信息到临时表
'N5xK4Um8x5I iU`051Testing软件测试网? ^W8H6j*_[x5[.[Mt
insert into Products_temp Select * from Products
51Testing软件测试网4Y5LGt:|4t
  此时SQL Server会返回如下提示:
p@M?I5QF Wn0
3^&Bn:J9Z/TGA0  服务器: 消息 3604,级别 16,状态 1,行 151Testing软件测试网x]#U}-Z3A

k%i nG0M9k0  已忽略重复的键。
7in6qSF:Z6a;uaw0
5JPZ'g/f0  它表明在产品信息临时表Products_temp中不会有重复的行出现。51Testing软件测试网6F4sL;S3W@2\R"x{L

u;f r6oOW3Y]0  第四板斧——将新的数据导入原表
D"[p} e]Lta]0
;xb~ b H0  将原产品信息表Products清空,并将临时表Products_temp中数据导入,最后删除临时表Products_temp。51Testing软件测试网)c-I%g"C%my*hD

'U-R7F7CMBPM} WD(W0
delete Products
mNy(v2w ZI0insert into Products select * from Products_temp51Testing软件测试网`H2k7[M$M_Fl|
drop table Products_temp
51Testing软件测试网&_dV2Pcv5CA

51Testing软件测试网(BB.O\5EY
  这样就完成了对表中重复记录的删除。无论表有多大,它的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。51Testing软件测试网/N J4? O|j:Ld{

7mBG!s TT9}V{0  小提示:上述方法中删除重复记录取决于创建唯一索引时选择的字段,在实际的操作过程中读者务必首先确认创建的唯一索引字段是否正确,以免将有用的数据删除。

!M og vh'F0

TAG: sql 数据库

安然的个人空间 引用 删除 coffeexl   /   2008-04-16 10:07:29
如果记录完全相同才算重复记录,那么: (sql server2000下测试通过)

select distinct * into #tmpp from tid

delete from tid

insert into tid select * from #tmpp

drop table #tmpp

如果有id主键(数字,自增1的那种),那么sql server2000下测试通过)

delete from tableA where id not in

(select id = min(id) from tableA group by name)
(这个似乎需要没有重名的)
 

评分:0

我来说两句

日历

« 2024-04-17  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 8432
  • 日志数: 14
  • 书签数: 2
  • 建立时间: 2008-03-13
  • 更新时间: 2008-11-28

RSS订阅

Open Toolbar