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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
: D0 W/ s) B8 S8 g8 n) U& ^; c3 r" g8 |& O  V  @2 A9 S( P0 ]
方法一
. `; V3 E1 z: a, U* [1 H$ s, X. y5 j; H
% G  G  b/ j# b( Y- l* Zdeclare @max integer,@id integer& u) _7 u5 Z9 i- }+ U3 }
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
! @# C* d+ K' a$ x" Uopen cur_rows
& `* w/ ?4 K% p. m! F/ x# e% vfetch cur_rows into @id,@max
  o, b3 ^' u6 `" z4 X9 C  twhile @@fetch_status=0
8 V0 L& z4 l- i# `. U8 I0 @8 y: wbegin1 p9 f& }0 F+ K0 z# ?, e5 `- h' O
select @max = @max -1
# \8 Q$ m& o" K8 m8 k% N$ b2 Z0 O3 @5 cset rowcount @max
8 ]$ R6 X1 k% E" Q" u) ^* _delete from 表名 where 主字段 = @id& N2 U7 {3 d2 F1 E9 U
fetch cur_rows into @id,@max
/ C: p5 ^2 D1 z9 Z0 {end
- r, i, `4 m/ k0 s4 Dclose cur_rows
% q1 L" O/ D# P7 N0 G" ~0 Qset rowcount 00 i* b' L& ], p& _' d* l
: W1 q+ k3 _9 }+ z$ W
7 T" z* @, {" h% T* d. I
方法二. L9 t% j& a1 `, H

5 P" U  I" Y* k, P1 S+ J  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。- U! o' Q7 C7 A' W  l0 j
9 j" B6 L: p4 Z7 r
  1、对于第一种重复,比较容易解决,使用
3 \+ E& ~) I( A/ c5 I. C
) C! P$ r. R6 _! Q( ?- t4 Nselect distinct * from tableName  l# _+ N* {7 \% u% d) g
7 P  A5 Z3 S; X2 R- r
" J9 |/ ?8 s: A0 l/ j* v
  就可以得到无重复记录的结果集。# }3 |0 \" x* L8 U9 `

' x4 T6 g3 J7 N! q5 h  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除* O' S+ t. [& x1 ]5 e+ M0 i: ~
( `3 S" [  W, G1 Y
select distinct * into #Tmp from tableName  g' J, U% _- c% H& i; M3 p
drop table tableName
/ k2 h4 J+ u6 hselect * into tableName from #Tmp1 J" z) w, V! U( U1 E
drop table #Tmp 6 ^2 l0 r5 A6 R4 ?6 r* x& [

6 F" r& V$ h$ [5 [. R" j) @# Z/ [) J
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。0 d1 D# a" b: z. T2 C; |$ u; V
6 v2 n$ y6 d7 \' {
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
5 }! x  k  ?9 u! |
/ Q- _5 D3 H, U  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
+ g2 S  B: g7 x4 J2 i6 \7 B& L2 l* x6 Y$ n5 n- q# i' I3 J
select identity(int,1,1) as autoID, * into #Tmp from tableName
5 v2 x; M6 R3 Aselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
! |2 `! e3 F' s$ D/ \  R. Mselect * from #Tmp where autoID in(select autoID from #tmp2) 9 m: F/ _# N2 f' L7 W
1 q+ O$ j) X7 @2 j; r* R

. H) t1 J8 U5 k- Q- E: r0 @# k  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)* N, t" S- {1 v& }4 m& K
8 F2 d  R) U" G# \1 F
  查询分析器不能单步调试的的原因
/ F# Y6 j8 u4 V. h2 w: P/ \- q+ X) E4 p
  具体步骤如下:
5 d6 p1 z4 g; w& j0 J: O" Q) R
' V8 N& r' h. R9 T  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
, q8 i4 t& a0 E# G2 p. c$ \# ?8 P0 ^; @0 _* D+ M' }7 e
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
# w2 _" P+ l6 J% |5 @% t, V$ S. W9 V( ^
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 1 d8 \6 j5 U$ A! c/ v$ i- X6 ]
  a、在【服务器】上运行dcomcnfg.exe; * j/ N4 F9 Y" e9 {  z

/ P2 D* K- ^: f* O  N% c7 J& d  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 0 o1 z$ x3 n/ Q" H" A9 B0 |

0 j- F% W! V, F  R4 r( W8 ~  c、重新启动SQL Server服务; $ \! B& [. |! G( A1 @
* h9 l, l1 G' y5 g9 F
  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
( U' B; u$ T. y8 i3 C  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-4-18 05:16 , Processed in 0.015600 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部