|
楼主 |
发表于 2008-2-7 12:41:00
|
显示全部楼层
回复:检索并删除数据库里的重复记录
(三)0 g( [( v' ?+ m$ S0 ]% L- u, ?) j
方法一
# t% n$ Y7 o& [. v: n% _
, n, u4 \+ f/ z, S* Adeclare @max integer,@id integer
" _* Z8 w1 q* e0 A& y4 X# _ j' w: [( N4 Y: c# N7 M- J9 g4 C/ @
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
0 v5 B: X4 A& ~1 d$ ?" X+ y4 u' a Y9 f+ t. |3 P
open cur_rows
( V6 A9 B7 M' Z2 x, t
. r! t5 M/ {3 P0 ~% r0 ^/ efetch cur_rows into @id,@max' h$ t8 w# f+ ]: s
( [- b0 {* n9 A% X* O& hwhile @@fetch_status=02 j- s, w2 k: o
" j2 d1 i* `8 p2 K* R
begin' x9 C/ P. f3 P& b
% \) f+ ~+ A5 Yselect @max = @max -1
) a( W+ `) G- j3 U( M4 B
2 w3 ~8 `4 t8 l' ^0 mset rowcount @max
% Q- \0 {, B( g+ I7 X& F/ z4 ^% `) P; S @9 `! K0 h: D, S& k
delete from 表名 where 主字段 = @id) ?! J$ E4 `0 U6 Q4 w7 w z3 c
; n6 C: ^8 F5 e6 p0 i2 M7 v- P7 m6 k
fetch cur_rows into @id,@max* S& n2 e% O, O& t( n0 V" t
end( x% y2 t. I ^' h- |% L8 s
9 I: @- |0 }& Z+ Y" g+ G/ m2 Jclose cur_rows
' F' [9 n. E. t, h
# h% ]6 i/ F& v! a8 n# o8 s! e) G, tset rowcount 0( M8 X6 ~% ~2 _6 k1 j$ `
7 ^. s' b+ Y# S( R3 ^
方法二
# s; e# R" v( A' V& u) E1 Z f7 n0 F8 |! W
"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
; j- `) i; C. o6 x, @( U; B% [, x, ]+ @) K
1、对于第一种重复,比较容易解决,使用
+ P, l, R2 d$ J, O+ ` R
7 |9 C, Y6 O( B+ v2 F, A& nselect distinct * from tableName
0 x6 {8 m8 i( w0 I4 ?) G
& j6 r8 x. r/ f& ]* b9 ` 就可以得到无重复记录的结果集。
6 a; K/ W6 E# o) Q2 m5 R8 D) v% [
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
" O; C% e; W# m3 ~$ l
; U$ D# z. {6 }5 d9 kselect distinct * into #Tmp from tableName" s7 [' L! a' h) t; P& K- x
3 |& _ ]- T! g! m3 u9 \9 p% @$ d
drop table tableName
, f/ g5 _) Z9 n4 W9 z# |, k) u5 e* c; G" G# X; A/ L% M
select * into tableName from #Tmp
* p( X/ S8 L4 t) g9 g6 U( g3 Y/ }, D0 s/ a5 R2 l
select id from tablename
. V3 ?; M3 h: ?' y& j
9 ^& f l7 V h5 R" Y( U' E3 qgroup by id
% ^7 q9 V4 o1 s6 Q. d7 I. [( K6 V# o$ e* i6 i3 b
having count(id) > 1
$ g7 x" Q- D' S1 l% r- C" O; J
) o/ s# W; g3 B6 p% [) |
|