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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
" }0 Y! M) e  |4 [! j+ {
  N! x9 P$ n# Y/ G  R方法一' ~: o" U! S& d

0 Z0 ^* y* ^  n" X& w7 T) hdeclare @max integer,@id integer9 g! Q* x2 K9 q# {% Q
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
* g4 P; k3 x1 L" y' ]1 |% H% u' Fopen cur_rows
* T( R7 v' q5 s1 m0 vfetch cur_rows into @id,@max0 R- N/ \1 c& |8 ?, s9 h+ y
while @@fetch_status=0
$ K7 |$ C7 o) A  {begin
) {) f: r4 r2 Bselect @max = @max -1
$ U/ m, F0 G( q3 j- d  {set rowcount @max
9 U5 c; M6 i. Idelete from 表名 where 主字段 = @id% t6 N  X% {1 m6 v4 M# y" ^4 ~) s
fetch cur_rows into @id,@max, K1 I/ Q) {% R5 R9 q
end
8 m; e/ R. ^0 X( d" tclose cur_rows( E. k% W! R6 Z- N
set rowcount 0
* p4 r% ~$ R5 b' }( G7 H. E! X- T. ?+ ?% l! g6 W6 g6 l
/ d& a7 F: k4 r# w, O7 g8 ^
方法二0 G: s& P* h3 k4 |+ d# G
* D: Q! m, k8 @4 d, \4 \
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。8 a$ l/ @% A3 v% U
# v1 h! Y5 b. j
  1、对于第一种重复,比较容易解决,使用) j$ V4 Y) Y) [  y% a  w

: {* r8 z0 v, Y: e2 Yselect distinct * from tableName
& G8 c, V( C, s* x) u) H- M- m# y& L2 m8 |& ]2 G7 a8 y

" ^8 _, N8 q1 N5 d  就可以得到无重复记录的结果集。
1 [, y! L1 A  V! w: M4 [9 g
* e  D. l, l2 S! ^  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
9 a4 _6 I: Q" C  a, c" V3 i" b8 s( a9 d" u) _8 b7 w( e1 X) d
select distinct * into #Tmp from tableName
/ d% y4 O) i; v% |: ?  Xdrop table tableName
! B3 G# S/ p7 r3 {, z) j6 Lselect * into tableName from #Tmp' y# u( Q# z7 ?" L0 \
drop table #Tmp
" ?0 U' B+ i% K
' T( D* u0 x8 I# h8 u5 n# D. D6 s# }
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
  O9 r+ {4 D  V: l  `- e, ~& d* N' ?: @- V- u6 @, X
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
" e9 O" \3 Z4 M" _4 Y( o1 J) V
: T4 y7 I) Q: [+ J  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集: u$ d- s! X1 N

% O# O6 C9 v: R* X; R# Nselect identity(int,1,1) as autoID, * into #Tmp from tableName4 Z* }6 o9 J; J2 H
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
# N+ W  x) x/ [2 ^select * from #Tmp where autoID in(select autoID from #tmp2) ( F* x5 m0 L7 d1 b( ^5 [! I* R
5 \# Z4 p" _7 C7 K/ V

1 o# p" k; N% d7 W! p  g  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列); }# o3 n8 Z( \
4 Z: b' U- S7 y' k- f% n9 U9 Z
  查询分析器不能单步调试的的原因
" Y5 j5 `! a0 y& w& s) ?- p: t* Y7 T1 b& Z7 q/ f% b$ u
  具体步骤如下:
* a) _7 ?' b& W6 S) P
2 ]- t* |9 t; m1 f8 N7 }  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 8 u2 _/ p  Q5 Z1 Q- t  j
1 M, k5 h  X+ h* E( m! z; q% ~0 Q
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
+ R9 m  r3 z5 Q/ z/ Q. [  o3 P3 b/ K2 @6 R% D6 M
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
1 F1 \6 B9 U) k1 `' A) ?: N' {  a、在【服务器】上运行dcomcnfg.exe;
/ w5 [/ Q6 s( C3 \$ Z: a9 J; q+ N3 I/ D9 n* E, f% B6 C
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;   ]/ }$ g) q& h* z2 i

; A% W2 c0 i( t' `" J  c、重新启动SQL Server服务;
  B; K5 S; W, Q: I6 h& A
! u+ {: _4 `; }: L( N) b  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
* j, _5 V' h5 w5 y, z5 q" A5 L) ~  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-7-16 00:14 , Processed in 0.021002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部