|
楼主 |
发表于 2008-2-7 12:41:00
|
显示全部楼层
回复:检索并删除数据库里的重复记录
(三)
! {( ?% g; B5 s6 G, _$ N2 q0 |方法一
2 r$ ?0 H# }2 z3 t1 v
0 _2 o, ?3 M& m& ?$ n7 Hdeclare @max integer,@id integer
1 ?- G9 g# v `& z7 m: J& S- W% s' [! o- @( e4 Q! N& a) |3 u/ q o" n
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1: r4 w a% y# I& L9 C6 M) U: r" k
% y0 U3 U9 q1 C0 Qopen cur_rows
3 E% }" t5 Z7 w2 y0 i+ ~0 p/ q# C1 Y- S# B
fetch cur_rows into @id,@max' W; Q+ o- C1 F. ]; E) }9 i
7 K0 Z6 M. W/ c; W5 W4 Wwhile @@fetch_status=08 u8 q0 B' o8 M) I$ E, O9 e
# x* s1 h W; \
begin" k+ @8 r0 @& w, v5 K# f
) h. r i2 a+ E9 p& c/ O! A9 n5 u
select @max = @max -1
1 C2 l8 R9 p1 X8 ]$ r8 A' K" W, _& ]9 N
set rowcount @max- h. s$ j% G3 r- J, p- K7 @# d
0 k t5 N/ ?. V: T5 l8 f1 X. Jdelete from 表名 where 主字段 = @id
8 G8 T8 N& N8 A8 C. ^* Z
+ [7 \# ~1 d' _& nfetch cur_rows into @id,@max
3 U* D9 K# W. e8 D0 h) S) Kend' g% Z* _3 P) F# v, g4 U6 F$ _- k
% s: k" z4 L5 |0 [# q" Y/ A! ~
close cur_rows
. \; M, O/ F) w7 m9 n; _* M6 m! s9 F' v( t& P
set rowcount 0
: _( B, m' r! M, G2 ]0 J6 o& J4 A+ M' {2 t; |
方法二
# B- J/ Y/ H( A% P3 p M8 Z0 ?% P- q( q
"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
3 N* y# k/ k T/ j7 v2 L2 K/ Q, |! ]2 f# C* _) |
1、对于第一种重复,比较容易解决,使用+ m+ s' l& `! n- \2 n8 i. f# Q K
* G' [6 V4 K! f5 w5 qselect distinct * from tableName
: ^3 R# y1 X5 `9 x) S% F8 I N1 L2 M0 h
就可以得到无重复记录的结果集。1 E# l# ]4 a) D2 }
5 \: \* b4 R- z) }8 U, B
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
4 S/ m+ j# j& `' i& h) y* u+ ]5 ~4 o Z6 u& o
select distinct * into #Tmp from tableName4 W7 ]- D [* S8 \0 O
$ K' b5 {0 C+ r. o% k+ Idrop table tableName
+ t4 ?6 s1 L4 j; `1 [" w. p8 a
8 M$ Z0 [1 |1 V# p$ M7 v- V( U# |select * into tableName from #Tmp* K) Q7 U+ u; o" ~' Y
$ |' y# m3 t- [' l* A! U- Fselect id from tablename ) y" |/ r. u1 t1 e
2 h/ M) p4 O; y, k b
group by id
6 d2 A$ z$ G+ S4 ~, W; L7 ~
0 U( T$ z2 `4 x) r- Q& I+ Phaving count(id) > 1
) h) t+ Y; c3 h: c) @) O& L
/ r% E6 q0 B% R, N* P b: B, @) |
|