航空论坛_航空翻译_民航英语翻译_飞行翻译
标题:
SQL Server中删除重复数据的几个方法
[打印本页]
作者:
帅哥
时间:
2009-11-11 23:36:48
标题:
SQL Server中删除重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
% A. I4 ~% ^1 D9 ?- x
7 b7 h- X3 E) C8 r1 J
方法一
% B( P2 R* i, j- z5 J% d
) b" t( Q8 e# D/ P5 d
declare @max integer,@id integer
+ E7 C/ v6 D6 Q ?
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
" M. \; X R6 W" _0 l
open cur_rows
6 q% O( p* f6 D8 Y6 z9 Z
fetch cur_rows into @id,@max
" D9 Z) t7 T2 ~
while @@fetch_status=0
3 \# {' p0 J5 N2 l$ x
begin
* n: A5 \. P+ d) i! e2 H/ Y4 p
select @max = @max -1
% `! i# @" C! p0 Y3 {0 Z2 Q) J
set rowcount @max
: V* ?& J5 V' m" o9 n
delete from 表名 where 主字段 = @id
% j1 P$ |/ |8 {. y# S7 v2 | c
fetch cur_rows into @id,@max
1 ?7 I }0 M& M
end
, i) y) D2 g* K1 j& i9 v" Z1 l+ N
close cur_rows
1 K* u$ l+ Q0 |+ J U% h" O
set rowcount 0
3 u2 T+ Y6 w' g3 P5 x N* R0 q& D5 d
1 T5 Y9 @! B$ ? Y
2 p8 L0 b* D8 [
方法二
, q9 a2 k- Z4 ?9 w4 r* L1 a2 g% {
$ n; l! c3 |9 Z. o( w/ D0 o
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
0 w# q. l/ L( m5 T# o
( W0 c9 z+ C) X4 @! e
1、对于第一种重复,比较容易解决,使用
3 N0 a+ [ b- s* a; x7 r5 v8 q
4 c& {& ]- t" S7 D' C O, m
select distinct * from tableName
7 i% ^7 n# B7 v* Y
+ J: T* U0 @3 f6 j( ]6 j
# T5 O; c* d8 s9 ^) _% K4 }
就可以得到无重复记录的结果集。
! B+ d$ Y1 D) e; G! o+ ^" a9 `
; _, D i* C* ]+ T8 z
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
7 \( g' z4 w! E" ] D
f& E7 i- J8 h5 r! _( Q P
select distinct * into #Tmp from tableName
/ b& w3 X. Y, w6 D+ z
drop table tableName
" ~* \- Z* Q6 C2 J
select * into tableName from #Tmp
# H* k* {* k0 p$ |3 }8 _2 |) }
drop table #Tmp
% f) @1 v$ J) {3 E, ?
) h% ^+ q* o# T9 S+ N7 r
5 E% E" s: Y4 x7 ^6 k: N
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
# ?: t, V4 q. \' B9 a* L9 s' v# i3 m
+ _; ~- ?: k# d; a' |% ^' t; J+ _
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
1 w! u2 p/ U0 M9 w9 v
4 C: O' l( Y4 j& B3 M
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
8 @# k p2 S1 R: U/ }
8 B( X# \) Z$ B" X: T3 V. n7 r3 D
select identity(int,1,1) as autoID, * into #Tmp from tableName
) A6 n0 b" |, o0 m
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
N4 F* k# _4 _0 g- I
select * from #Tmp where autoID in(select autoID from #tmp2)
8 \7 ^7 U% Y/ x4 U3 ^; l0 D
8 s& F: z6 ?2 [/ r
- A! e% l' f6 c. D0 X9 E
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
q5 b$ v2 P* V) o2 X) x( |$ x
$ N4 o$ k8 y4 U u0 r/ U# Z3 x" p( `3 `
查询分析器不能单步调试的的原因
+ V- A6 ]9 W) U+ B) \6 i2 h; q
0 o# s# r- @+ x3 B2 c5 }6 r
具体步骤如下:
& ]; _' }' v8 S: M- ^ w
Q7 `2 G/ f" y' j
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
: p( |5 _. p" A# ^! D4 j
0 B# @) q" R1 V, W y
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
/ ^* g9 @7 }2 q4 f. B# k
: B! F" {, c; |* W* e
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
- I3 J; U" m6 P
a、在【服务器】上运行dcomcnfg.exe;
- u' z* q, f# `1 l {# n4 J6 |
2 o! p) P# H4 g1 u, N
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
' P7 |; R0 q5 u$ _7 I' |' r
/ u+ A- ?7 }% h1 r
c、重新启动SQL Server服务;
( z9 [7 U, I5 l W+ l) `( j
8 u$ b! A3 g# X1 t
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
3 B8 I1 |+ A' D! G
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/)
Powered by Discuz! X2