航空论坛_航空翻译_民航英语翻译_飞行翻译

标题: SQL Server中删除重复数据的几个方法 [打印本页]

作者: 帅哥    时间: 2009-11-11 23:36:48     标题: SQL Server中删除重复数据的几个方法

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
% l8 k3 C2 y+ H- U$ W3 K5 V7 j/ e' Z: Y& W2 o
方法一; @: @9 C. V" U; w* }5 D: l% u' L/ h
' z6 V9 ]8 Y8 A+ X
declare @max integer,@id integer
5 b( ]- d1 O( \8 o0 f: a4 bdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
5 E( q: B/ c, c7 `. A! w. Z3 Topen cur_rows# y: k. x# @3 v5 \. b2 `8 j: ^
fetch cur_rows into @id,@max
! x/ {% g; _  Nwhile @@fetch_status=0- k& Q1 D- e. v! Z7 G0 v6 I
begin5 l! z7 c/ V) C! h
select @max = @max -1
, m: t+ e. s" S- S& V0 _set rowcount @max
/ ^5 Z- S# d  \" ndelete from 表名 where 主字段 = @id
/ s7 v" G  e3 [3 s8 Q7 jfetch cur_rows into @id,@max8 B, v- a& U0 Q( M: c
end# O2 t) e) q! S; p( k6 D. J5 I8 S' w
close cur_rows
( A+ {5 ]2 X5 Gset rowcount 0
  n5 z+ W9 m' o: I& x: v! h' j6 [6 V2 d- |5 Z9 V
+ B5 U  ~5 V0 l: ], C; `# }5 |
方法二
. ~8 T6 G! j# l( \* c6 Q. [& {2 }1 @: K6 ]
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
! @: C( [6 Z4 [* q2 h. a$ A$ b9 b, ^+ R3 o- z( A; A# C3 v4 l( s
  1、对于第一种重复,比较容易解决,使用1 I4 Z0 o% S2 b- M# t, X! L
+ E- G; d8 E, a% t' R" b# S
select distinct * from tableName
" A3 S3 i; n. Q5 [0 i4 ?
7 [+ s- Z( u8 |% y2 [/ J) h$ H0 M. m5 g- A# ?2 v* |
  就可以得到无重复记录的结果集。
7 }0 q& Q) ]% Q
8 E0 j' p3 H  Z$ ~! `# s  K  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除* ~4 W1 a$ D1 ~
6 l' E3 H& u, s" Z
select distinct * into #Tmp from tableName* o" H$ H# e4 s% k- [, C( L& d
drop table tableName
3 t& P. r6 `+ }8 J) Wselect * into tableName from #Tmp
) r+ H2 o' ]' N; Z4 rdrop table #Tmp * }) A' r0 x" k' h6 W0 b
% ^+ }" l6 r+ {( w/ y8 B6 T& b# W( \

! ^4 G$ N5 X9 i$ [8 H% `# m# |  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。* T# c- Y' {6 W' l3 j/ ^

6 f9 B' N/ ]+ e4 b* n# R  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下; j0 ]. ]4 U( d& S1 k" T8 U
8 Z. e, U3 G) \$ k3 ~" R4 K1 R# W
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
' f8 N9 z, F. S* x5 P. O* K! X- C: z& t( S
select identity(int,1,1) as autoID, * into #Tmp from tableName: b5 d3 f7 F; {  u6 I" w
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
2 d. G4 z! C: b% Dselect * from #Tmp where autoID in(select autoID from #tmp2) 6 d; C  ]. e6 o# \5 v  v
2 r, Y& e3 o9 X8 l" d. S9 a

; L: ^) u& ~) j$ q  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
/ ~9 m) E6 u. e/ g/ m1 h
0 ^( {1 x: o. s2 H+ w8 I  查询分析器不能单步调试的的原因7 f: Z1 z/ [( c% w  L1 h2 `- q0 d
( [3 w+ Y- E1 A1 r1 q) W
  具体步骤如下:
4 @" k$ y5 U4 Y3 G+ N  n  ^  j4 d# q# N$ K# I7 S# O! |: n. B5 C& t1 O
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) : I- f6 W* g8 n8 Y: ^) E& t. A

1 s0 x/ w5 h; e1 L  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; " r5 r( u" p3 J3 c

+ j  B& @+ }+ f/ [  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: - @0 j) B$ o) |+ B
  a、在【服务器】上运行dcomcnfg.exe;
% C1 A2 }6 {9 N( r6 w: n* v, O/ b( a7 Y, p* W) d- m
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 5 S  \, b3 p) C. z" ^& E: ?4 H- V
. G  }9 ?# h( D8 b- S3 F1 d, Z$ n
  c、重新启动SQL Server服务; 5 Y+ u1 T! A! [# X
' z& [9 [/ g5 r( |
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 0 ?9 n6 Z' A7 _; c- @* Z
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/) Powered by Discuz! X2