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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… 4 p0 n& N9 i) n+ q% ]6 P0 m

2 T. p5 [2 @9 b0 {$ S方法一7 ]2 }6 G. q" ~4 d+ n3 Y) L8 m

$ H+ k7 l2 ~0 w" Y( p) Udeclare @max integer,@id integer( R) `; |5 v! Z/ x
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1- C: ?7 r/ T8 a0 H9 ~* k
open cur_rows
" Q9 f+ h3 X* jfetch cur_rows into @id,@max. Y. J4 p  X: {6 q6 d6 ?( H
while @@fetch_status=0
& j% u9 \8 m, L( X' L& D  Hbegin& y$ @9 Z/ ?/ g
select @max = @max -12 t4 r1 g- P$ x$ I& K, }: R
set rowcount @max
5 d( _0 F8 h; h1 x& x! e; x; udelete from 表名 where 主字段 = @id
4 N) N- u% t# xfetch cur_rows into @id,@max  I: D3 b% _5 b6 G5 L' t
end& @! Q# E# f% _4 v" [
close cur_rows/ r* {. X. s+ g8 j1 W# [& v2 L
set rowcount 04 ^- G/ ?) \6 F" }9 @' |
) U7 k" |9 A; a7 H% p" x( J# P6 N" u6 P

9 u& D$ a5 ~" e4 X! `& y方法二
0 ]1 v( ?- [& `" N$ ?" A/ h( [& r1 \1 F  L: \$ ^
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
; A2 K  g% N6 p2 L+ D9 D
% N# p. l8 Y" q. |: H* P9 B  1、对于第一种重复,比较容易解决,使用+ V0 c' w* U$ p7 D2 a. B
, w& ]. z/ S9 w9 [
select distinct * from tableName
! r3 Q6 k  @) V  `* E5 k
2 n( |) D% M9 |) L: m6 }2 r8 z& m: o
  就可以得到无重复记录的结果集。+ q( ]( G3 w3 p6 |* I

6 y0 S8 S: C9 s. [1 d2 n) D  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除; K7 [" P( i2 i! c, n, ?
0 p& Q! M3 R! [
select distinct * into #Tmp from tableName
0 ?0 y1 W- ?: h; ?7 w2 J9 f) rdrop table tableName
1 d' p; |* Y6 [6 nselect * into tableName from #Tmp0 k. }' g1 U. h+ r& s( `
drop table #Tmp 2 e: x$ c, c( m5 g# c6 |! E

7 B4 l9 P* q7 }. ]) z2 ~$ s' {3 _
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。3 p+ f- H3 m7 k: |3 {
" K9 g# c2 K3 j- R( A4 e
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下/ S5 Y% {. v. a' }$ Q
) s7 c- `  r1 d! D) d* L
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
, U/ B) y% I/ @% y, d
0 I5 E& y' J2 I1 Jselect identity(int,1,1) as autoID, * into #Tmp from tableName7 T+ K3 T7 L! ^. o
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
4 c6 j  z& e  O6 h  C) Nselect * from #Tmp where autoID in(select autoID from #tmp2)
8 N' i. K3 P9 ]! e4 h5 J8 U! N! q8 b- `4 I. c8 F, G6 I. V
! Y- v1 P+ e6 Y- s8 R- \
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
" z. B4 u$ N; Y* L9 K
/ b- n: @. L8 c" }" F, M  查询分析器不能单步调试的的原因# J  u- G9 w; \7 ^4 M# F; ?
% y: s3 B. ^4 t8 c
  具体步骤如下: 1 z: D) j+ ?  ]  l
1 W4 D) ?3 ^2 L  l0 i6 b3 @- @8 Z
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
' G" @& x# D, L5 {. N# M" o4 ]1 X" x+ Q- Q+ x% j
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123; 9 p; b- H: y) Q, b1 |+ X) g

; W; ?: X  `/ R. O5 j, y  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: & L5 R7 L# ?( ~5 }" i& s  V& n
  a、在【服务器】上运行dcomcnfg.exe; / k0 i2 }( a1 E1 E+ B& k" L. }

; Z# [3 Y  D8 I  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 3 g. Q$ R) R' w
1 V, b# z9 e2 O5 K1 j; e
  c、重新启动SQL Server服务;
! r5 }) e5 G' A5 T1 g0 C% [+ x; E1 Q3 j" H6 @& P; R
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 # Y( V' O8 s9 w& I+ ]
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-9-10 05:45 , Processed in 0.022001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部