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

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

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

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
( r6 \3 n# ]/ _; b  E( d+ p8 i0 K% Z7 S. G1 L& ~" x; x) [( ^
方法一
( z. J% d; f. o. m- G; t& {# T+ F$ P% U
declare @max integer,@id integer
9 B' O; \9 _& Bdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
1 g) q* J0 T- Y' f( `open cur_rows
1 F/ a; e# m) g; V9 ]5 ifetch cur_rows into @id,@max
0 e: Y% N6 L0 |+ |, A0 Ywhile @@fetch_status=0/ X  P. p/ M) E7 O: [! L
begin6 J& `) F1 t! V  w3 V1 K2 ]& E
select @max = @max -1
7 a! N8 U* k$ T  e& R  b+ qset rowcount @max0 A' Y4 {+ d5 R" \: t4 Z
delete from 表名 where 主字段 = @id' @  T1 @9 `% E, Z& k
fetch cur_rows into @id,@max( l$ L; v  [) |' [
end5 ]# M0 x% g) v! x4 S+ Q. G
close cur_rows
! I, d8 v$ G- G! V( Oset rowcount 0
" N/ P8 N9 b8 B- s5 Y0 `. ]- H: c
; X# _! {- h8 e
( r: f3 L1 Y$ [方法二
+ i7 Y5 ?" X& e# Q, J
1 x) p$ a& ^) ~3 P8 _  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
. Z4 i, {! m: Q' l0 o/ ]/ S9 _6 P2 A
& T- L5 z( w1 s6 U+ |9 Y& J8 f; W  1、对于第一种重复,比较容易解决,使用
+ |3 |! k  U3 q# G( i2 d! ~+ K: [( b+ m4 I( B5 c
select distinct * from tableName
: S4 z( I1 _/ w7 H, W* t! z# _
2 q" c+ N: E& a& Q! I; D  h( v2 u7 u: V3 r
  就可以得到无重复记录的结果集。
# T9 }# |' _/ i" _4 m+ X
9 b" g* h2 e+ y$ k6 w. R( Q) [8 |  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除+ P, m7 ~* b6 w; S/ h  Q5 f

9 i9 f+ @% b7 X! h) zselect distinct * into #Tmp from tableName
9 q6 M' |, w5 k( l( p4 \$ ]drop table tableName
; `- ?- M6 W- w4 Jselect * into tableName from #Tmp
3 d) m. ~6 ~1 }! j* s) pdrop table #Tmp
2 C1 u7 N# [, {* q* J* H9 P; b# I( C9 @& _$ ]

  L9 J% p) ~* p  |. v1 V' ?  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。) v- D( i+ |  \- N) Z8 K/ e
! ], U( \# n! C8 M2 j
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下9 S4 r1 N# m2 C

2 c: A8 Q2 \1 B9 y  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
3 w9 p- Y- B$ }  C3 G* P0 j
4 c9 c" d$ f' I- eselect identity(int,1,1) as autoID, * into #Tmp from tableName' x) q$ x# ~, M* ?4 I' \
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID/ I& T' ?6 z  P2 W4 @3 X
select * from #Tmp where autoID in(select autoID from #tmp2) ( o* H7 }- E  u0 o

4 F! A  i+ Z! U& d7 g. l  a
( S) R! c& |" h/ C% F% ^% {, s3 q  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)6 |  |, z# i: [
9 ^$ c8 V- z( T
  查询分析器不能单步调试的的原因$ T4 \/ g" ^: n9 U2 `# s

8 ^: b- k' X5 R7 I' c  具体步骤如下: 2 ~: d1 |+ B2 y5 |) W# P, o

2 H. y: B0 J+ P' z  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
5 N; {1 M7 P+ K. \0 O1 n
& R% J/ ?9 Y( S9 K  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
% s# e! k, M' R: V4 L) ?' e) a' V( G& L4 n" I
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
; Y, D4 ?6 j& N" S& m1 z2 x" [  a、在【服务器】上运行dcomcnfg.exe;
$ b( ~  C, }" L! q, x, c1 z
$ C: M5 s* B" }; m  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
" H- B9 C' X( q# E& ^! t5 c
! c8 Y' q  B  `5 U. Z  c、重新启动SQL Server服务; / I% F+ [; s+ H1 p# k; `2 Y! a

$ p  U2 V, I# a  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 # U8 O) c( J' r! E6 p& X
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




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