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

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

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

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
, H0 l; z( ^3 F% G4 l
; H& S( y  j3 Z1 ?方法一
+ G) @8 X8 {9 f$ a3 \* ~1 ~
# I! p+ u+ V' R8 ~- rdeclare @max integer,@id integer0 x  z  b4 ?2 C9 d# X4 G! Q1 H
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
6 F/ A) V  ?; N- i% Lopen cur_rows
4 r, K8 A3 j1 s: Afetch cur_rows into @id,@max
/ \2 c8 ^5 d+ Y) `2 m1 c0 hwhile @@fetch_status=0. \2 [6 a$ z) H6 h+ X5 _
begin& j1 _) M+ V; ^9 `, e* `" R
select @max = @max -1
# s, J6 e0 r1 K1 G) i& hset rowcount @max
) B/ k% W: T$ e5 b8 gdelete from 表名 where 主字段 = @id
5 f) ^8 x. Y9 Q2 A2 ^/ mfetch cur_rows into @id,@max
0 i9 V5 a* N' A; f! Y2 Kend
! L1 [% y& ?; O* t9 yclose cur_rows' J+ o; g9 x4 B2 }3 _
set rowcount 0
* q, ^5 g% q5 J1 S3 V" V, H
; U3 h; W; T( Y. K4 ^6 W6 F- Y) Q+ w8 e# @
方法二
% Z& }& a# {- o* o& j
# T$ x! s9 Y; J# \0 w, P  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。; t; f8 @! x9 F. K2 T
1 G# c% a/ x/ g( h- c$ X
  1、对于第一种重复,比较容易解决,使用
% K4 j7 R; {8 o0 r( k" O+ m- j# a2 q4 ~* k7 p
select distinct * from tableName2 X2 w6 d. D( G, }7 P3 {
/ s: N2 [* A( p- ^" j3 Y/ L
# l2 X  r( e! n* F# a3 P/ ~
  就可以得到无重复记录的结果集。$ c8 Q. j) S- y3 B( L8 L, K

5 Y1 F3 S2 ?4 g. A( v; p  L) {+ q  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除6 q( x; r1 S  T8 L( w+ G1 p$ d
! \1 G& h( L; o& }
select distinct * into #Tmp from tableName1 S$ M: x3 o/ }2 B' c( j
drop table tableName% T% B. ^6 c+ g: z
select * into tableName from #Tmp
0 y+ d- l3 U9 F4 l9 V& [drop table #Tmp 4 }( M1 ]5 m& z- O3 L0 s
$ _+ ~0 `& ~4 s$ T) E: P
9 ]. A2 h5 l0 E, g" @
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。5 N" n* `5 p% ]  m( S; F! f
! H1 L' M8 v& h
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下1 Q1 e7 _$ b3 J

( B1 C, S! S& t9 \  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
8 B% z# q. j: @9 u+ A
  L  K* D4 o$ hselect identity(int,1,1) as autoID, * into #Tmp from tableName8 q0 y/ n0 j* V. v# r. U
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
! o7 s: m; K0 U% |) U- R! _( V; Q5 V& ?select * from #Tmp where autoID in(select autoID from #tmp2) 8 u/ ?  i' P6 w) ?9 Z+ C' N

% M* a/ [% t, C* v1 Q& r% a* N
4 Y* S1 g) @1 }  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)$ o) _9 r  C9 U
  f* a- p& C6 N* @! B
  查询分析器不能单步调试的的原因8 q" ]& t/ U& e# q0 a( a( V+ \
2 [) @( Y8 n/ I0 r- R9 {
  具体步骤如下: * @0 o3 y: U& u, \7 h; Y& ^7 w
* z5 _. K1 T& T: u) @
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 9 V( i, I; e' E- V1 n

0 ~4 F( H( c9 n, c# V2 T  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
4 a2 y$ X! s* X  i( \0 |6 q
( {# I6 a+ M* _( P. x$ A  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
6 r$ f, z2 k. Y8 @2 W! A; v  a、在【服务器】上运行dcomcnfg.exe;
* W* @" d3 A1 B( i) ^# w, w( k5 b1 R" p* K3 D
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; ( e0 k& V  I: @8 _

* @. `4 s) g1 r' M  c、重新启动SQL Server服务; 9 k* v  j" D' m+ K
9 q. H* A( Z4 a% \  a* O4 K6 _
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
5 D1 |! W1 |4 A0 F. Y; F  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




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