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

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

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

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
- L6 F( d- F* T" ~* G" I/ y% Z( A6 D
方法一8 D, l  k& O8 \  H; T
/ v& x$ p% }' V6 k
declare @max integer,@id integer
" x" X( ~$ a+ K3 {8 q$ Adeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
( U' ~0 R4 R+ X! y4 copen cur_rows
* [+ E) g2 \" Q- d& O9 }0 U. N' c& Hfetch cur_rows into @id,@max, [- a; b2 E' U* k* P2 n( ?7 M
while @@fetch_status=0/ ~* U0 ^3 ^% K
begin
1 i. X  f' D5 Bselect @max = @max -1; G% X( \' J4 C- [+ ^
set rowcount @max( l; T5 a& x: N: Z" g& B
delete from 表名 where 主字段 = @id
% R! w3 ^# v, f" Ufetch cur_rows into @id,@max
: Z9 m* @! c. p$ g# V5 Qend
& n+ l0 g: l4 [" h0 xclose cur_rows& W1 {8 o: d6 u2 K  x
set rowcount 0
, |$ V  j: ^5 G! @+ ~& S# E/ c" o* q; \
5 k; _! e& P. w4 j: a* f
方法二
! \- i5 L9 y' F4 P  t. d
6 D: j# ?: q, j* o- k  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。1 h* S/ a6 W( [! K" f( T& g! J; d

! m$ ^) r% K/ U( d8 S6 l  1、对于第一种重复,比较容易解决,使用9 `- ^# m3 j: o4 I6 |& Q: _
- [" B, P5 J% ?- ?9 K
select distinct * from tableName/ c$ v" M( [1 \
2 w* E; G5 d+ X: ~, H
) e, Z3 W: K! H1 G4 a! H
  就可以得到无重复记录的结果集。$ P8 v3 Y, J4 ?; ]

3 T- W' R! k9 u  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
5 \1 g8 B/ `, i  T
# h! u: Z: _7 c5 f# Y7 rselect distinct * into #Tmp from tableName# R5 y' l  C& Z
drop table tableName
7 u0 s- ]% o$ A) Q% w# Iselect * into tableName from #Tmp  o5 `) N) t) |7 w# X4 }3 e# W
drop table #Tmp : u  G; ?( W) y
% L9 ~" |3 u& M6 R$ A, Q, C

( ?5 n0 v1 e: E# B; Z  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
+ k0 h! J0 J1 p/ O" u4 J# T
% ~1 J" W  \0 m/ W! B  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下, @3 I# ^# D8 ^! k$ I

7 @  @# d) r# w1 A+ L. H1 j8 a6 w  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集2 j$ P1 R7 t4 H' W* E: f! T

$ M  i5 q3 i( B1 |; l5 X& T8 @select identity(int,1,1) as autoID, * into #Tmp from tableName
, p: a2 r7 w% I; t" |" bselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
5 j8 j; f; `& s' j4 v9 @% ^select * from #Tmp where autoID in(select autoID from #tmp2)
9 _+ W& ]6 z8 Z- r% c" O6 `/ {' I* S0 y) @9 L# M; K$ _! N' D
+ R2 U9 ]5 W8 c$ e3 {  v& }( m
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
) u8 d: d2 v; X4 w+ D6 V3 ~: Q* |# [2 @1 A* y4 O$ s' ^
  查询分析器不能单步调试的的原因7 K* H# p# N; ~: o- S
, W% S3 f* R1 ^# A* s& |
  具体步骤如下: 9 v& A( m/ w9 l% Y- p! b
8 Z( ?8 `; x/ F6 @4 u6 d
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) ) `5 d( b( v2 }1 |" P( p
0 U1 Z% o; s% ~' f  F
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; 5 l+ m6 z( M5 I' q

  K8 U1 |+ g& n+ u3 y$ Q  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 0 P: |% E9 [( N1 F( I
  a、在【服务器】上运行dcomcnfg.exe;
) F( |/ n% |) M* h: o. g
, j4 B( C( h% v3 Z  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
# ]% K& G, {% m5 j# Q, S) D+ l! B" M  S+ c7 f+ l' y
  c、重新启动SQL Server服务;
( Z- B0 S  h+ x6 C0 \2 o. L% f- m) k  M* r
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
- \/ h8 y% X3 a0 o5 P: W" w+ u  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




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