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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… ! m$ W0 n& \! `' j2 W: z

6 o: _+ {" M( s! n) l. u方法一
. p' q1 P( X# i- m8 @; j
2 c" t6 d# B$ ldeclare @max integer,@id integer- l( {3 `6 N! N) t* o
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1/ R9 g1 \3 H7 O% u
open cur_rows
  [4 d8 M. j8 Q. u; {: f8 [! g/ gfetch cur_rows into @id,@max0 o4 E7 G' r% t; ]! }
while @@fetch_status=0
6 j" W: y' y" u" H+ q: f* [; ]( dbegin4 y% s* |8 m4 U0 g: f
select @max = @max -1, X8 Z3 t3 V3 E$ _
set rowcount @max2 b7 X8 n1 a7 g4 h. ]4 c# P
delete from 表名 where 主字段 = @id
/ V9 o% k0 ^- l; \fetch cur_rows into @id,@max
* Y4 t, u  C0 g  H0 yend
( J/ f0 P4 I5 h" Mclose cur_rows& g/ {, v- _" K/ x- _) R( w
set rowcount 0$ J' g# I' ?& u0 m) `

5 w, ?4 H& K0 `5 z0 U2 ?: `* T: J* u% p
方法二
8 i: {" }! \8 }+ ?/ f8 p7 \6 v5 @3 U  v* e* y- G
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。. j4 }: U# G, n- B( m( C: r. C
8 {+ r) z( e+ u7 w
  1、对于第一种重复,比较容易解决,使用
3 g6 q" c/ [' ?9 Z  C% H$ ]
( \  y$ Q' z8 j0 u: P- O/ Iselect distinct * from tableName
: v9 s- V9 F2 E, ]; @6 p
5 X7 h9 G; l6 {/ T8 W/ g. T( g7 d# ^* P  |, P( @, ?, E
  就可以得到无重复记录的结果集。' I7 [2 A/ ]3 F' U& r5 z) q
8 E% B  }; g. w* z4 M9 }; f7 Y
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除, T, H* F9 Y) C0 C
# U8 j( f2 k+ e
select distinct * into #Tmp from tableName
$ {' J! K$ Q( @# F. b7 v0 V8 idrop table tableName
$ S* v' R7 U. [) e2 e) Uselect * into tableName from #Tmp0 c* j* G" s: G9 Z0 P
drop table #Tmp . H3 o+ y% m- U' J

- M' T3 {. ^  q. T7 K
; c4 X9 _2 F0 |- Q; |! M  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
- s8 U" C5 O5 j; K# R
; l& a" j* I+ Z7 t7 v" y$ K, T  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下) I5 j  v0 n; L& F4 q! B8 k& a

5 |; }) y3 w1 D: f7 l. D  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
' d6 V+ t) s+ y! Y* h5 }( |. Z) g% O) B9 c
select identity(int,1,1) as autoID, * into #Tmp from tableName+ j2 a, w* Q7 {3 q5 B$ `6 m/ T3 \, j* R
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID5 c# c5 H% d+ R
select * from #Tmp where autoID in(select autoID from #tmp2)
" a1 J" l5 ~. j; X
- q6 H) j! T7 i6 O( z& l1 _$ l! `) d5 K  B" N4 |! u6 S9 [. e2 ]
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
9 ^% N  B5 J. O! v- `
4 I9 U, @, h% F- l! D7 P: w  查询分析器不能单步调试的的原因. j5 l( B- W# y' ]0 c: o
8 W' G- V3 M' t+ R5 }4 F; R
  具体步骤如下:
- p' ]+ P' D$ j0 t7 D/ r/ N
" x5 G8 [/ y- X+ D  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
+ E! i9 L0 F; Y2 I1 D2 c
4 G( C' I& l6 U6 z0 F$ R. v  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; ( V% {# }" V7 P0 l. A* D7 z0 X

+ x+ m. B9 E! o: f" m- D! `  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
* k" D* Y* o% d! S# L  a、在【服务器】上运行dcomcnfg.exe;
4 K7 {: t0 O1 K' Y# r: w0 L" N4 b' [5 e: C9 |
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; & E# `+ }& q5 h( U3 c+ F
" x4 l# H2 C* O# d# M7 t9 @; S; U
  c、重新启动SQL Server服务;
8 i4 W7 b* ~& z3 V8 i: i7 ]* Z4 E: W! u; @& R
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
0 f3 x% ^! _( W8 A% n  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-5-1 05:13 , Processed in 0.031200 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部