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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… * ~* w9 }: v+ u$ C3 j. D
0 R5 y# r/ p" X0 M& Q( A* s8 P% n
方法一8 E+ a% \; X" P3 P4 T
" z% m0 Y6 i' L
declare @max integer,@id integer
1 A4 n8 f4 Y+ {8 ^$ D( T9 odeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
/ t% k; ^7 C. I. K- C) a  F6 Popen cur_rows  u: n6 W# D# N6 x
fetch cur_rows into @id,@max( H5 Q/ e& d9 _& f6 C
while @@fetch_status=0
3 e) u. {7 q9 d8 w! ebegin
$ ~0 N$ b# q" L, g0 g! l; D2 Cselect @max = @max -1
8 \7 x8 h/ U2 s' U" qset rowcount @max
3 h. [5 B- `/ q5 _4 z) edelete from 表名 where 主字段 = @id
7 `' {& B) k4 ^4 ~- y* {fetch cur_rows into @id,@max
7 M: ?! x3 u( Y. Y) yend
6 c) l& S8 t, ~$ ?( b& iclose cur_rows
1 F6 i  i% ~1 [set rowcount 0+ u' w- J) z+ \
, _% e6 m6 O4 ?
" M. ^! y1 Z% h: K
方法二
3 x, S, w( ~! }- I7 k' W; S2 d$ t. Z% d* g9 x- R
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。" ]0 T& U+ _" d& v# Q& G
6 i; x1 Z: J4 X0 r$ r, \
  1、对于第一种重复,比较容易解决,使用
1 X* W! W. c9 |  a0 y5 G' B) B! p' T1 Q' U( P. N
select distinct * from tableName
' Z5 v% H: [7 z$ |9 b4 f. F+ F6 _; J; y2 V0 _% h' P) U$ r
) e. t1 @, a/ @! q+ B* A
  就可以得到无重复记录的结果集。' [' W% G# E& ?

- a/ K4 |, ~0 q4 N5 x" ~  }2 A  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
! s0 S0 H+ O  g% |- n
% O* b8 t( C) _6 m; J/ T3 T  cselect distinct * into #Tmp from tableName
8 C# P. J; l2 w2 fdrop table tableName: V/ a7 V. l9 ], G6 a/ I7 L) d
select * into tableName from #Tmp
6 N2 V5 w! T) f# a( A- Z# fdrop table #Tmp ) |" g$ |# t6 C2 J

, L' ~8 @" K( O9 U
8 |5 P  x' {" t5 c- C4 Z  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。( r, r2 B' ^5 _3 [) i3 F# B
0 L* m* k- ]5 Y0 s7 d6 o4 w, ?
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下5 D/ a3 M$ ~' [0 e

: Q  Q8 C% B% f  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集9 `" c/ f0 Q) B  z  x- S3 z- ]

$ d* W$ W2 g( b$ ~8 gselect identity(int,1,1) as autoID, * into #Tmp from tableName# v3 G7 @  Y" @3 `! S
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID; n8 w0 E) Q1 y- ]
select * from #Tmp where autoID in(select autoID from #tmp2)
: ~8 n# T6 v1 d1 S' b8 w6 Z
+ q& G5 N0 @! ~4 M; w/ e0 o* ]9 }) p( [( H6 K3 ^
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)  o! p! m% Y4 e4 Y0 N  K8 C6 Y

, ]( R4 g4 ~2 ?5 e  查询分析器不能单步调试的的原因
; y$ N6 @( ~4 s
- J" G) ?& W( M' x- y# z1 t  具体步骤如下: ) i9 X4 Y5 b# J+ i' W
; @5 C, f2 \" U3 M2 S
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 7 ?* z0 {1 U& B; q

. F5 W4 U, m4 @5 c+ i  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
  |3 X) _( H8 @2 F% s: R* N" ]0 L
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: # l- D* h  c9 k
  a、在【服务器】上运行dcomcnfg.exe; 2 r9 I# M; l, \; M) W* K) W
* X* k3 L2 t) X' [( G. @
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
5 e7 h) @8 t+ H+ i6 y) z( h0 Z' Z8 ?9 i) ?& N
  c、重新启动SQL Server服务;
: x* d. \5 N( M9 x6 P& {) C- G$ [# j$ _: q6 Q
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
7 ?/ O, P- M9 E- Z" M: X  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-6-19 03:36 , Processed in 0.021002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部