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

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

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

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… * y& }1 S, i8 V9 ]* H& ~4 H
+ ?) C  O! i0 J0 z. z
方法一: d! K: o) g5 {% J' ?# e
, o; k9 i# G  g. t
declare @max integer,@id integer
( q/ E! C: s: u7 ~declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
) D, T0 e2 A( G$ U  s+ g0 Dopen cur_rows
3 G% T* b  A' d) h1 Afetch cur_rows into @id,@max1 \0 }# I) F& e! T% |
while @@fetch_status=0
! n7 Y4 s0 L' O/ @- abegin
: T# x9 _5 P  Rselect @max = @max -1
% H+ p8 j: r! S& W% s8 S- vset rowcount @max
0 t* E( c- h2 _delete from 表名 where 主字段 = @id5 d' b5 H* S' G  \7 c; @8 e
fetch cur_rows into @id,@max" w+ H! W: F3 M3 _) S$ Y6 W
end
+ H% j' Z; _, x5 Y1 ?8 Wclose cur_rows
  v0 A- k" f! f5 E" L0 Bset rowcount 06 t" Z8 k5 D2 O

# f, J' `$ ]8 A" i' d
# w% O, c8 t  q- j) x% B方法二5 L& l$ Z8 b7 M. \
! U7 o$ X6 a7 I$ A4 [, z- N- ~, x
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。6 l  s( Z6 U" w5 K$ B. Z

* J8 X; S- s/ h0 e2 T  1、对于第一种重复,比较容易解决,使用% `0 j# f% D& [

3 T) G8 X% M+ ^/ c1 l" o7 n! K; f( lselect distinct * from tableName
  Q" D& w% H2 \( b. ?8 ]$ u! O2 [( n' W  W0 G% N1 S; T) ~6 n
8 `0 c  R- g6 t9 o1 {+ u& T4 X
  就可以得到无重复记录的结果集。
; A: E) ~* N1 A! w: X# i( t6 ]4 F, N) u3 A( g/ F& Z
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除0 O% n9 {. i( `3 u

* m5 }7 H5 z6 @$ t" S3 T/ dselect distinct * into #Tmp from tableName
9 R% ^/ Q6 f. |4 pdrop table tableName% m9 L8 A' _7 V4 j& Y
select * into tableName from #Tmp$ b- z1 s& p5 \4 X7 G, J
drop table #Tmp
0 K+ {* W0 t# ?9 a4 b# r4 C  P# U( v& R1 C( n

" `: V3 E4 `" G4 R2 Y: L6 W- H  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。' R- w: W8 M& a0 [
) Q7 Z/ n8 c8 M9 R. N) s
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
1 l' J. N2 ~" v% _' f4 Z; s
  `6 w" U! `9 y( R" E  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
' O$ @, O/ V) f/ i. S9 ^  b  Y- k: p$ J" y. E7 G9 R
select identity(int,1,1) as autoID, * into #Tmp from tableName
( @+ ?2 u& c  z: V' |select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
, Z+ ^) E* Y: |7 hselect * from #Tmp where autoID in(select autoID from #tmp2) : O/ A7 D  W8 X9 ]

6 z' u: |3 t# l* z# K6 b8 U
- r8 s# A0 A/ n& U( V$ ]  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列), f& {/ f% F- V2 _  q
4 o2 N4 L, ~( Z' k# @
  查询分析器不能单步调试的的原因8 [! m2 U( c6 k" j& U, g3 G

6 F* ]+ s  V' j# G3 @  具体步骤如下: 0 c! ~# Y; g! g6 V: ?& A1 Z+ u
% @/ @* }7 d' V- x
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
' I  o( u9 f/ x9 f5 N# B: C9 W7 g& [1 O! b2 ?( U
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; " G) m% A0 k0 l) t8 P

, x$ {# C% D: k5 x" w6 z  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
: I8 t0 h* A1 L# F' `7 w  a、在【服务器】上运行dcomcnfg.exe;
  y# S- ?8 a* d+ u& q  M" K: q9 N8 J4 k+ ]7 l; @
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
0 x/ w' w* G% U$ w
1 P; r" m5 N, f2 |  c、重新启动SQL Server服务;   U# N7 x3 j2 N! C1 z& C) H, r

7 V  F/ j2 b1 P7 @3 \7 U6 w  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 - f2 F+ O3 _5 `: v. j. l
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




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