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

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

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

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
1 ?0 x6 N& p$ T2 q, ~2 s  h
/ z  Z) p( D' f5 u3 Z9 ]方法一
' W3 k/ n% U; b
' t$ y, O. N6 V- l: g* {- I' rdeclare @max integer,@id integer: V; Z' O9 C( r  @' W& f. c! }. H* M
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 13 I, l6 S# C" r; B3 U  C
open cur_rows4 |  s9 V3 j/ L$ U) e& o5 v8 {
fetch cur_rows into @id,@max
2 h) ~) o+ `+ w5 z+ x- p/ W& k+ hwhile @@fetch_status=0
, V5 M  F1 \' G9 M  a6 L: [begin% e; Y5 c* O" d: M& e
select @max = @max -16 X" E: L2 R! p7 W# x7 H# P' u
set rowcount @max
0 h' D: F3 C, H. \- {( jdelete from 表名 where 主字段 = @id# Z1 R1 N* s' C6 G& E% S4 n* \
fetch cur_rows into @id,@max
) j0 X1 g: l5 C  G# Cend# m0 z' o) m# b0 Q8 \
close cur_rows
- ~% R1 A: `+ c: ]set rowcount 05 K7 y# K! B7 L, U1 k/ U( n

" a4 a5 G$ L8 c9 y
% W! t" h3 w1 r  I$ J5 g方法二
1 F! P% n/ s. Z7 L
* p) Q* _% [7 \( I3 i0 q  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。# z! ~! r" j" p4 ~

; D) K$ l; e+ e, i' A0 a8 R9 s  1、对于第一种重复,比较容易解决,使用
* ^6 v! q$ D. N2 w; ]6 l- ~' z5 @1 W/ z! s# _( K
select distinct * from tableName
; v. o' ]; L3 X/ b
  h. X! j% u3 X! g; B9 t; J
! H! T3 |8 G1 k0 Q4 \" i  就可以得到无重复记录的结果集。
' n+ s& z; ~/ r4 l9 X. P5 P' u% |: ?6 M5 F" _
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除9 @- v  x, F' v" V# {* O' c

) e8 u% ?$ \4 x& l/ B9 U5 ^select distinct * into #Tmp from tableName
4 V, ]6 R7 l. M2 W( d' [drop table tableName1 [4 ?9 ~& P  {, d/ I; z( Z7 p# K
select * into tableName from #Tmp# I2 K+ g- H* U5 L" p: k
drop table #Tmp . m1 D  o* ^- X, t2 a

7 }+ K. a8 e0 Y% n) W  [, d+ Z9 G" A
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
; N! K) b3 b+ r0 W$ ~& z, ]5 {( w: ^4 G( |
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
0 k  N5 {6 f  W/ p, S. e9 P+ F) B  Z0 G# s( c
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集% t3 b, ]9 D0 \+ Q! R

& Z" s/ V" L( \; xselect identity(int,1,1) as autoID, * into #Tmp from tableName  Q2 U5 v# J4 z; g
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID5 z7 S7 Q, ?' a3 w- L
select * from #Tmp where autoID in(select autoID from #tmp2)
2 i$ s3 C$ p3 @+ Y( a
3 B0 w& \4 Y9 b5 v
' m- M. `* W" l4 g5 m/ v0 Z  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列), w  b+ o! p7 f0 _, l) S5 r, A
  |: w. Q' Q7 ?7 I
  查询分析器不能单步调试的的原因) X' J, }% S1 w+ H/ |
4 x& }% y, g2 @5 w/ b
  具体步骤如下: # x- c: y1 h. o' p7 m9 |, a6 s+ l

0 J9 y4 c2 a9 O9 a  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 3 n: J7 Z$ j1 s% K
8 h" U! {/ b! [) @' D. ~) v
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
' \0 M# b$ |) M, U+ _* ?7 W: M/ X: e% a$ m
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: + g& L8 T  ~# p; w- U% t0 u
  a、在【服务器】上运行dcomcnfg.exe;
% V% S% E4 H! W/ A/ ~; E
6 i( E  j) t+ B3 |% E2 L! v  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; ( [( t" z+ e0 r! e2 h- V5 p9 W7 c

- g0 K! A) I/ }8 p  c、重新启动SQL Server服务;
: d& q6 P( t; _# O% H- Z- `/ e8 C2 ~4 H. ~6 P: D3 K
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
6 o8 P% S* N) `: q+ ]  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




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