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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
5 A3 e& f2 O6 l0 Y% F
. n( Q. W8 P0 j& c5 Y& r$ f方法一5 e: C6 A6 [' a7 T
* ?& g/ z; G8 z7 H! L8 @1 l$ T( u
declare @max integer,@id integer$ C+ s4 h% U" s
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
- a1 B3 J. h1 {4 p- y: eopen cur_rows* K2 |1 t3 J! S  _' U7 i, Q# O
fetch cur_rows into @id,@max
8 b2 @0 W! I, Hwhile @@fetch_status=0
' L" ?- V3 S9 ]+ M3 T9 S4 T9 Pbegin6 ]0 I4 I/ D* x" S: k
select @max = @max -1
" u( l2 \- ]+ Qset rowcount @max
/ Z1 Y, N  O. }' X6 H8 Qdelete from 表名 where 主字段 = @id# A4 W) X6 t9 I* R* @: b5 ]* @; ^
fetch cur_rows into @id,@max7 f% z8 K9 Y/ n$ m0 @
end3 N9 x' ]/ @! I% ~% W  ?4 w
close cur_rows
" C5 w& o1 ?  K1 Q4 L8 v6 _set rowcount 0
+ R! @5 `  N" P2 l$ t: ~( y5 E* j' H( w; d8 q+ b3 e- [2 u$ }
. D/ f+ Z/ |1 s1 N( M
方法二6 {: t2 h1 Y6 e0 f) I2 p
+ D6 `7 [& i4 A8 g: L3 Y
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。( {2 E8 E9 R1 g2 E1 P% {) w
; P9 P$ W" g# y- j( Z) M* A
  1、对于第一种重复,比较容易解决,使用/ T3 {- G. P- T( l
: a( C  o( O% L$ g5 k7 ?
select distinct * from tableName
6 @) y) F/ B* K, {6 V! g  [4 t+ ?, O( f* t- |

/ @( C! P& j$ o  _4 V& t; E# K7 D( e  就可以得到无重复记录的结果集。% O, @) L  Z& b( |! K& [( d
! m+ k- `) L8 U
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除5 y& @2 h' \% R3 M0 d
0 {; |4 f. @0 u0 R# v8 `
select distinct * into #Tmp from tableName
# @% y! w) Q2 b+ e2 r% d' ?6 `) s' pdrop table tableName
/ |, _  F1 ]( ?- K% ~select * into tableName from #Tmp
: m- H* s3 Z( @  T+ Rdrop table #Tmp
5 Y3 e/ V+ R" K$ \' R( q/ p  L2 N0 ^- T5 G$ F( s# F  r. z
; D! L' w% s/ D9 a+ e
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。( u5 M1 }8 ?2 S5 u- C  \5 U* f7 o

0 B9 t4 v6 q* j/ R  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下6 ~; V5 v8 @/ C; x) u

) e4 u# j" a8 C9 K" u  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
9 O2 m( a( Y' ?; @) B$ {* ~- D' C; x
4 b# l+ A- J- q/ K; Wselect identity(int,1,1) as autoID, * into #Tmp from tableName- m; G# {4 c  ~, n' t
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID3 p& y# p0 ~1 d
select * from #Tmp where autoID in(select autoID from #tmp2) , A1 A0 K2 P# V( \/ j7 n8 N

4 W9 @: {$ \1 u" ~  J. d! `
  e: S+ Q" s2 R& p0 H  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
+ x! k$ R1 ?. F7 F. ]/ A
+ J7 E' @9 d3 `: i3 R  查询分析器不能单步调试的的原因
% s+ H9 g" G8 L( ]( L& q% u  S* N" L( E6 j2 {
  具体步骤如下: 5 w1 P; n3 d8 X) [, b9 P# {6 Y" a. L

) Y  P  B  ^/ ~0 v8 ~  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
4 `3 y2 F9 o( s3 t" u$ X5 G7 E
2 r4 e( l( M4 x0 P  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
( e) E' R# E6 s0 G' ~: k  |2 W3 n1 S9 w
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 6 Y4 t( W  k' w
  a、在【服务器】上运行dcomcnfg.exe; 5 I. t4 q  u) c# `$ r0 r

. W4 Z2 i# @: Y0 Q; k" w/ F  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; ( G" O. Q  H5 v
; |  f6 S/ B1 |/ B5 e  Q
  c、重新启动SQL Server服务; - y, T9 D2 e0 b& I5 r$ y
4 _' H8 {; L& @2 v% m; I2 f
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 " I% ^. N) s  t" R$ ~. o: f
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-9-5 09:07 , Processed in 0.022001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部