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

 找回密码
 注册
搜索
查看: 1509|回复: 0
打印 上一主题 下一主题

SQL Server中删除重复数据的几个方法 [复制链接]

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
9 c. Z  F( ~$ X/ o/ K/ S' Q4 B" g3 B5 R1 k5 D1 x& B& K
方法一
7 G( L! l& s. v* C( f
! g- M& c% N2 \- b& z6 W' Udeclare @max integer,@id integer. [: j% \- @  y) B2 Y6 `- o
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
( r. _' R9 ?9 a( z; Wopen cur_rows
0 M" p9 O/ [/ @fetch cur_rows into @id,@max4 X3 e" y( u& p
while @@fetch_status=0( {9 D0 L) }, F  n& ?3 l
begin" m- G' D$ r, |; @2 L
select @max = @max -14 t. M! @" L. q8 A% g
set rowcount @max* J: Y& _: P4 s( ?' X
delete from 表名 where 主字段 = @id
0 M+ I' w3 ]  A( n* w, H' A" _fetch cur_rows into @id,@max" \  D/ I) n) M- n  B
end
3 B3 b/ ]9 \  B0 t. \close cur_rows
0 I( ]& w3 s5 p0 W- {9 t+ X# Gset rowcount 0
  h% {( Z$ I9 y; o- e7 k4 t: ?, |
4 T8 ], G# ?$ J' R7 a
方法二. r" F. C  T, L- Y0 M
4 W! {# k) x: ]
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。  h6 {+ O& |( O. Z+ Z9 e! z: a* Y3 {- X
" f2 R. N# A7 H' K" v0 \& q0 Z% y
  1、对于第一种重复,比较容易解决,使用3 q. w. Y7 C/ Q" i8 ^
: m0 p5 d6 l; Y9 P8 r7 q9 E6 }- S
select distinct * from tableName
7 d7 X6 I$ X, i1 B3 Q0 _
! O  M- S) m# d6 e5 T# U$ ]" o, F5 m) s" v8 ]! v. |
  就可以得到无重复记录的结果集。
; g! z5 r+ [5 q9 d* }3 g! j( K( \' r5 J+ E) P6 Y- |+ h  `
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除* m; U0 w' Q- n

8 L3 G% m4 Z+ T) g2 c* h5 ]2 Oselect distinct * into #Tmp from tableName& \( e* I& U( k( W" ?% }
drop table tableName0 K0 |0 W# O3 `! W
select * into tableName from #Tmp
, A  v4 c$ V7 P& g& H1 z  zdrop table #Tmp
) X; K3 G: B- K2 g2 A5 W2 t
, T' g3 C( t  p. S+ n4 P1 L4 \% y/ e
# W4 _5 M  b- k' J+ W$ u0 @) }" J3 y  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。/ x8 F$ A- \( [7 d  O8 j" h
2 Z& H& [- ]! u9 v
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下6 H8 A2 d; E% P. t+ r
( j: O7 s7 k( Z5 G! o, h" V
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
  [2 V( f/ Y2 S5 G% Y; v6 G5 u+ C$ ^$ Y" a7 @) x4 U( e
select identity(int,1,1) as autoID, * into #Tmp from tableName& z# q4 t  C" f  |$ _
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID9 `& _: e9 H% }
select * from #Tmp where autoID in(select autoID from #tmp2)
/ `2 J: w4 t1 }7 Z' Z4 K2 _5 d4 ~* v$ n# M; s& {# Y( _* t
( m, V6 Q4 l$ X0 n3 O
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
! {0 D2 K# d5 l; w/ H8 b; q" W2 U, y/ Q: Y- `/ P5 E
  查询分析器不能单步调试的的原因
5 t7 i0 Q' C3 ^/ C; L% I0 d, n. F7 b. @/ q3 g, v- Z3 b2 K/ _
  具体步骤如下: & @! @  ~+ D3 h% r" I

, y- V& k& j0 `3 n, w  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) ) f# B% i6 I6 V/ d8 U0 o# T* }

7 @* r& k8 p; _$ c7 x  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; & M# W% R6 P6 X. O% G' N

7 C( W# H, f  k0 m6 S  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
& i$ K0 L0 \# _# ~% A" g1 {- G: ?, p0 F  a、在【服务器】上运行dcomcnfg.exe;
& ?( r4 Q! _7 X4 y4 `
' \5 E! W% q/ p4 A% k0 v8 S  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; / W# k! K7 W( n- c' D7 T+ J. p

# ?1 p2 j! N% _  c、重新启动SQL Server服务;
+ u3 D$ ~  V1 e3 Z: L0 ~6 V' \, h
& d/ I6 G: _  p! ^  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 ! o* ]" u. k+ z" V
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


Archiver|航空论坛 ( 渝ICP备10008336号 )

GMT+8, 2025-12-18 13:50 , Processed in 0.023001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部