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

标题: SQL Server中删除重复数据的几个方法 [打印本页]

作者: 帅哥    时间: 2009-11-11 23:36:48     标题: SQL Server中删除重复数据的几个方法

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
3 l) h7 ]+ _4 [6 Q+ o& K/ a2 `4 n- e  d
方法一
; P8 u4 d7 d" F. C1 i' B( h; ^" [" S" U
declare @max integer,@id integer; u% R! y# Q; {% u
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
1 ]+ ]  n. r3 k# S# Jopen cur_rows" i. W, d" d. K: n  F9 C
fetch cur_rows into @id,@max! c2 V3 X6 e  m* i3 e
while @@fetch_status=0" }; m) a1 C' f5 B
begin2 [% k% q% ^/ [3 M8 E
select @max = @max -1
5 p7 P6 A# A. F# W4 w7 W5 ^4 Yset rowcount @max2 F3 S+ g5 b6 h3 u/ I
delete from 表名 where 主字段 = @id7 w' m( j, X' s7 o0 K& j8 b
fetch cur_rows into @id,@max  `, s2 h; x6 H/ n' T" p
end
7 S' p+ A: f3 K% W( B3 h1 [close cur_rows
7 J3 A  b' I2 r/ ^set rowcount 0) o& B) p  ^% ^# ?- `
' V; I6 o3 _3 ]# ^. \! T" |

7 F8 M3 z; T" t! ]$ d方法二0 }" h7 _0 r' Z+ U$ l* _$ S

( {# K# t, G8 Q/ R0 G; r5 Y; o! r! s  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
( H  K: K2 R  G$ c* ^- ?7 X: W/ g; C6 x$ H3 M
  1、对于第一种重复,比较容易解决,使用- z4 R+ b; a; T4 E# E
/ y' K  U7 q# P, J' p, U
select distinct * from tableName
# G0 @. y9 U* @! _6 M2 A/ m
: L4 i( [4 _4 E; E0 F, `! w6 p& F0 W* c4 K
  就可以得到无重复记录的结果集。9 h8 Q# T, q$ J+ ^

9 P. z. `+ N" L* ~& _2 o; ?- s  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除' D2 z* ~% _" i0 i3 ~, o; S. @

' B2 I% ]* o$ T$ z  i1 S- Pselect distinct * into #Tmp from tableName0 E6 B* K& @. d& [
drop table tableName
3 d, J/ |+ N/ \$ fselect * into tableName from #Tmp3 P4 I+ a/ \4 A" H. q! R
drop table #Tmp / O8 s( e) |5 ]

' @" E1 ?' I2 ]: q9 F9 R( j5 j- ]- S  E' t- b& }
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。( Z' K0 k* `0 u8 ~% L8 I
2 G4 A& U$ K- T+ A$ m
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
2 [: e  T' g/ r4 u9 z) T: J" c8 a$ o! b$ e* O: t
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集( I; ^7 R' \  v; u* S5 `8 w( ?

8 Z% g& C2 a1 b5 h; _: cselect identity(int,1,1) as autoID, * into #Tmp from tableName( Q2 o0 e) @: C
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
) T; _$ s0 \- \$ _  gselect * from #Tmp where autoID in(select autoID from #tmp2) 3 v; _  m  |# y* P& P$ o

; @; z+ S4 G8 X$ L+ X. M) _& O) n# v$ N4 b
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
9 b+ i( }  F5 K" U. r" x4 j
7 {- i  t! o: v  查询分析器不能单步调试的的原因+ N1 w- H2 B7 m/ a
  D. m, f; |! Z; w) u( V
  具体步骤如下:
: e: l+ |# e% Z7 U
3 \! ]. z0 p1 r  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 8 {# u) M( J8 }5 W

& ?8 D6 W0 z: t. ?  D  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
. A. p! R& m: k4 @% F- G: R, d# I) t8 [  o, ]9 {: O3 k" I( ]
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: - c2 h8 ?* g; a; j
  a、在【服务器】上运行dcomcnfg.exe;
( z" O; F( d& x( I5 W1 {0 W
: ]3 s& _& ?; t6 P; B0 [  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
* \$ G/ p4 b! {6 L: n- R" z6 f1 A9 e( q
  c、重新启动SQL Server服务; , l$ ^8 I. b/ A* I6 d* r

7 V2 q9 b" E0 u2 b  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
2 g: c: z# `1 R. T  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。




欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/) Powered by Discuz! X2