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

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

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

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… ) u% I: c$ p! i* n9 I

: @# j: }: ^3 Z( |方法一( Y- x. j1 h: y" f  v; v$ A. L, Z

3 w' w# Q* D, j) r2 \: U# udeclare @max integer,@id integer5 U, l% [8 Q3 ?
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1" N5 v9 M. d( }* x
open cur_rows
- W$ s  B* O1 }6 ]$ ]fetch cur_rows into @id,@max) L, ]% T7 W: e6 `. @! U% M3 i
while @@fetch_status=0* u/ n- V1 t: ]" W% V2 l. k& O
begin" u+ A; {& a- t  f9 c
select @max = @max -1
* Z) U. O! }5 Jset rowcount @max: u" M2 U1 @2 M0 ]2 e0 T
delete from 表名 where 主字段 = @id
) ^# U$ P$ ]4 a$ j5 sfetch cur_rows into @id,@max9 k8 ]+ t, L2 c  i/ Q  x, ^) ]( E
end. v8 n; B6 F6 Z% N# Q/ N
close cur_rows/ Z( t4 ~3 S6 T5 k5 L9 @, z
set rowcount 0
; [6 Y% s" _9 ^6 K- y5 ^8 V  o- J4 s( N! n7 o

0 O* U, j# S+ z% S4 N0 P& \方法二
- b# Y- i1 ~- ?0 f8 b2 }9 y
9 X0 w! q) o1 z  T. Y, N  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。! p! h$ o4 U# L
- r( J' v: V4 G3 J
  1、对于第一种重复,比较容易解决,使用5 S* l6 p* u9 |7 T+ q1 Q
, D+ @( S4 x) i5 _. ^! @( ]
select distinct * from tableName
6 K- X  c) \* F7 _" @8 C0 n! R4 n& V' y
4 \8 g0 E/ |1 [2 _4 @
  就可以得到无重复记录的结果集。9 G3 G+ g9 [2 ~9 ^% {7 D
7 @" T0 v0 B/ A2 ]+ n1 ~5 a! e) r
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
8 v8 [! C( K" A( N
" ~8 m$ ?4 T. N9 q- @select distinct * into #Tmp from tableName
3 [3 e$ I* T& j1 M/ {drop table tableName9 ^! R8 O/ A7 l
select * into tableName from #Tmp
6 Q3 z) O6 B2 mdrop table #Tmp
1 s1 e1 P% R8 `" w1 z' o' C6 t) ^  C

# E0 f, O1 Z  E- ]" L3 W+ M, z7 }  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。# i- g8 {% d% ]( l' U7 Z/ W' l" q
& Z( c5 ~2 V, P7 O8 p2 y/ t+ K2 k3 f
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
, a) i$ v8 o: ^8 ?( J% J2 f9 Q  Q% _+ W0 t
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集3 d% J! _9 M8 {7 I% @

1 D2 [. s: ]( \. fselect identity(int,1,1) as autoID, * into #Tmp from tableName4 Y" \7 ^# |+ E8 K$ n' O7 L
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
5 F9 @  ~8 a3 k) ^. a( oselect * from #Tmp where autoID in(select autoID from #tmp2)
1 \! O. j3 c$ ]6 [4 X. H9 m2 T: J; F' H
, }! f) `" ]5 c- X/ f9 p
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)) N" p* E3 k1 t$ L) p# @1 w

4 U% `# S: p" M1 L  查询分析器不能单步调试的的原因
1 q8 r7 A5 P; F' }) c" f' g) |# K7 K. F& O) r% M
  具体步骤如下:
# o. o& B, q% O" g4 Q
9 i( A4 Z6 D* @  C. G+ Y$ K# }8 p  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 5 q# ?/ d9 U* O+ W4 R0 G* B
  K- E6 n) @4 c) @$ e5 e  f  V
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; 7 p, H/ B9 g1 ~( A9 \- W9 a

8 n+ a. b9 w. B& I/ k2 U+ [  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
7 Q: J* @+ }! e& A' V  a、在【服务器】上运行dcomcnfg.exe;
  r# w% I# O' m1 Q; ^
2 \# `, S6 }( Q) j  r& e" u. v  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 4 F8 N% {( B4 a4 G7 x! r- F
4 _) f9 _; [  \0 b! ?4 i
  c、重新启动SQL Server服务;
4 L8 A5 z' z! j0 Z( J' [& `
3 ?  \1 _4 F: \( \' M- Q  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
/ ?* H) Y2 |# L, H" e# D  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




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