航空论坛_航空翻译_民航英语翻译_飞行翻译
标题:
SQL Server中删除重复数据的几个方法
[打印本页]
作者:
帅哥
时间:
2009-11-11 23:36:48
标题:
SQL Server中删除重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
! h; S" u8 {, F+ ~8 t
" M5 p5 ]5 E! J w
方法一
2 \8 R3 f5 n5 n3 [3 ]/ c; |
7 |* Q8 l" ~% Z5 _ \$ B# G
declare @max integer,@id integer
* G- y* ?0 S- A4 K" `2 h/ c
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
* m4 r( r3 S/ b1 s# l i
open cur_rows
) v/ m# D- n) R4 x8 I0 o& g
fetch cur_rows into @id,@max
" y1 d: e* ^- m
while @@fetch_status=0
7 X7 O4 [4 Z# M9 ~
begin
1 o. X- |4 [1 a
select @max = @max -1
/ | X3 A$ U- O2 x+ U- u
set rowcount @max
, J$ W" ]6 ~/ L. b0 D3 L
delete from 表名 where 主字段 = @id
# E) }5 K. j! M1 n
fetch cur_rows into @id,@max
7 M7 N4 k& k/ T x. S
end
2 a- [7 c6 P; [* O
close cur_rows
( \, }6 \5 c* u8 V# y% W/ i$ X/ Z# f
set rowcount 0
7 l$ B& t; h, G, @) M1 e$ p9 q
8 c& V, j9 E+ Y3 n% i
0 \. i+ B0 T8 m4 d/ _) E
方法二
' \% \' ?. t, o( I1 |
% o& w1 k! C* n
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
- N1 a2 y# h& B' g0 p7 h
" Q2 ^: x, ?' r1 v+ n, L% \
1、对于第一种重复,比较容易解决,使用
$ r4 y& ?) [* q, y; w. u8 W
# w5 G: [! X5 P+ W% u1 W# S
select distinct * from tableName
; Q3 F: _( o. h" R9 D) P' k& M2 m o
1 z% U1 ?0 e$ s ^) s
( A. m* E' Z3 x
就可以得到无重复记录的结果集。
; s9 c* n" k- |
' K/ U ^( N8 X# i$ @
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
8 q) [8 M( v2 {% g8 U" Y, H
; n% V# X; b: X' P6 Q8 ^# n
select distinct * into #Tmp from tableName
+ D; ^$ s5 @5 b7 X
drop table tableName
/ G! y; G. D: J, [9 D
select * into tableName from #Tmp
# }1 D# I9 L1 y# k6 m2 D3 _
drop table #Tmp
# L) p) O3 T+ x: U
b0 [- y; Y/ l* E" j( i q
( N, H; Y- J4 r
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
& E! ~2 A1 _) Y0 }. x& g+ _( S
: q* A1 o2 m% E3 j* Y! v! s( f
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
, H9 ]3 N: ?1 } m! x
7 g$ p2 C% h! B8 _, S
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
, z1 l# @: i: l- X8 W- C+ \
0 P9 ]# b2 U5 O7 V- R5 ?+ c: D
select identity(int,1,1) as autoID, * into #Tmp from tableName
: P; c6 p' c$ p
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
9 D& n; t9 |: y. ^, [% l7 Q( N
select * from #Tmp where autoID in(select autoID from #tmp2)
4 L7 T1 h2 D* ]
8 P. p& O- p! p2 m# E5 Y
* {. s6 {0 a- O! h) _9 i, h8 `
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
6 [* ^3 M. T& d7 b! l$ V
0 \: h4 F5 S& C; ~% m! w
查询分析器不能单步调试的的原因
* Q$ ]4 p7 t% m* c' ?& x$ j
7 o. q9 F) }7 o. T
具体步骤如下:
5 R/ W# X$ l- I, o" [
/ H5 O0 @" h( j
1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
- o2 Y3 v% M2 b" v* q
1 C* x1 J6 m* K
2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
- k, @; N" m: Z2 J6 V2 U
6 |! J1 ~4 J, |, P6 v/ b; \$ ?
3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
4 o- e% n: r8 x8 q
a、在【服务器】上运行dcomcnfg.exe;
' b: F/ v& A6 R1 a/ E9 O3 ^
2 r3 b" P7 E- _ O* g! ]0 `
b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
4 D! y9 o# d V; b! e8 A
# z; `# `8 C$ o7 q
c、重新启动SQL Server服务;
% U3 e1 j5 U. B, W, G H0 H! ]$ b
9 [" k9 j+ J- p/ [9 ]# R
3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
' f: a9 h8 O/ _) t0 a: J
注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/)
Powered by Discuz! X2