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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |正序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… , B2 {+ V4 [, `8 v) K: d
$ Y4 \4 ]/ D  I" D% L- L
方法一% h( h7 }. b7 m
$ J" ^* @/ O- H. i' `( e
declare @max integer,@id integer5 \. `% @# i: a  y" `9 i
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
, T# y: ~( F( E1 [open cur_rows' i+ q9 t! o0 F) b6 H
fetch cur_rows into @id,@max! n) j5 L' @$ q
while @@fetch_status=0
% U' p. \4 N; s/ O0 ~( gbegin" Q9 `. y% ^( U" J9 D; {( x
select @max = @max -1% X1 r# }+ k, z/ F) [$ S8 ^
set rowcount @max* r# Y# x' l1 h8 ]+ z
delete from 表名 where 主字段 = @id6 @- p) n3 m2 v8 b7 C7 H, B8 m
fetch cur_rows into @id,@max$ u- L5 l! I: E! ~1 o  U
end
# u! H( Z' ?* \close cur_rows
" c4 K( \0 a6 ~/ N1 i) lset rowcount 0
6 h. s+ i7 S/ o
' x( `" B; c1 v) a2 g/ c* @, S1 Z5 M, {) h/ V  y+ E
方法二6 m8 p+ J2 X5 N9 D

% |% J) [* |9 V, K% B% C" x  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
4 P  f  A% q( m- }+ s) x5 O6 M- j
( b0 {7 y% z) i, m! t8 O  1、对于第一种重复,比较容易解决,使用
, f' v: r4 \6 h+ X5 {+ Y& d6 _
% l/ r: [- R$ e2 X' g1 u: ?select distinct * from tableName
8 |  F7 Y) b; h) J8 F4 X0 s  [& t6 _
" q) o; L7 i- U! C" m) K$ a! O. e, l. S
  就可以得到无重复记录的结果集。
; j3 ^! s9 B. @
7 N- X* i, y+ l! V9 T# a: c$ p  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
# I2 ^. M5 |+ P8 s& e) Z6 c1 G) Y: [6 L3 \' X* s( ]
select distinct * into #Tmp from tableName$ M+ Z/ n3 \5 T" X: C
drop table tableName
- d. S7 }( F* ^# O4 g6 F8 Iselect * into tableName from #Tmp+ i5 Q8 h* r: {" \
drop table #Tmp
! o$ Z  D" A6 u+ F. P
6 g2 O- Y8 q0 x+ H: w5 S* E1 T  d: C0 w1 [
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
; ~- ]/ c; f5 K7 S7 f) a* C; a& z
& B9 H4 N+ {" N8 {7 m# z  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
4 L4 v, C+ Y$ v  R" w5 g0 _
8 u3 g, e. K5 I7 D! L) p  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集$ {$ T% M; Y4 }  ]% A/ `& g  M

) S9 E# r0 R% q8 Q3 ?9 Pselect identity(int,1,1) as autoID, * into #Tmp from tableName: m4 _+ K  o2 Z, |! C9 ]" y
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
+ \" N- o- U5 |select * from #Tmp where autoID in(select autoID from #tmp2)
$ u' o; y) L0 C; B/ \9 e; d$ t/ [; Z# e3 Q1 h# x6 M& s5 W2 ^
" L- R  [( T5 `1 N  x' {
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)4 l; d) o6 }8 e( D+ l) T

" b- Z+ S; j  B3 i# {) l" ]  查询分析器不能单步调试的的原因+ X3 M4 d5 D- i- M7 m" _

6 o+ W. r) p# I# m: m6 O7 z$ R  具体步骤如下: ! I/ [5 `3 Z  ]+ \, s- t+ g0 ?9 z

2 ?: R, x& |1 g, h3 i7 S  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
4 `2 P+ J& _6 ^$ l% j; H3 g% G% s. w# c) Y
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
3 X9 k6 A7 n6 @+ c$ @$ @9 p7 ~7 B" u4 I$ ~4 q8 n: }. ~
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: ) h+ o0 U( M4 |( p+ z* Q
  a、在【服务器】上运行dcomcnfg.exe;   o8 T, f8 H' u; p$ b
1 B# y- K5 G3 A) H1 P0 ]
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
8 Z7 a0 @: k% G: I
# m- o% J0 g2 [  c、重新启动SQL Server服务; / C- ]" L! ?9 |  C" m" D
# _- s: X9 z3 U7 w# B. |6 @+ `1 |
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 2 g; y2 H  r+ r" d9 x
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-11-25 03:44 , Processed in 0.022001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部