在SQL中删除重复记录(多种方法)

上一篇 / 下一篇  2008-04-08 19:08:08 / 个人分类:数据库

数据库

B1S&c Hw0F0文章出处:http://www.pconline.com.cn/pcjob/other/data/others/0508/693592_1.html

tm0a"N)@5WQY0

I'n_x Qg+I H0

51Testing软件测试网Y.k#d)dH'x ~

!K9? ~/~:Fg(a051Testing软件测试网2r)[#QQ/@6fX@J

3ubB[+J/Bfzo0

学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录。后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录;还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例)。51Testing软件测试网E2`:Z:b"l}-g

\#G W6K"_b[/S4W0SQL>descemployee51Testing软件测试网C0lU,{!z/_5T0wf

51Testing软件测试网K N)@2\y8k,h

$qGmtUH/Pj)I:V0

$Wk;\Rk8gJ051Testing软件测试网 [Um:[#F'c/]&o$a

 Name                                      Null?    Type
-@i T2_(e;L0 ----------------------------------------- -------- ------------------

f@_!V P8mEE\0

a-B O8w'a1Q$I3I[LV,T0

9a,}/v;e/f7N0

AT&_ A2h0

emp_id                                                NUMBER(10)
N1j:N!t| f0SK'O0emp_name                                           VARCHAR2(20)

.Q%e7\.d%{#t4l0

D D K8]p&X e$C051Testing软件测试网 CUkI Cw,i

gg*TyI n0

salary                                                 NUMBER(10,2)

Z5d\JIR7CU3I1O051Testing软件测试网{,Ju,J,Z)B

51Testing软件测试网T.p0ZE+O)`;s

1V)I*p#_"WpG0

v7i:p M7AS0 

3`+H{zZJt f@ V0

ITtO,MS0

^3B\0]#d0

可以通过下面的语句查询重复的记录:

3k3@~7` P0

^+ws.|)cx5^#W0

,|6pec^+f,l`S0

pp@#?/R(l(G051Testing软件测试网4}._d4lZ;t3e)X*M,Km

SQL>select*fromemployee;51Testing软件测试网/X4A GT"Ri

sxP6]xiJVb)uY0

.JJ9QH;kG]051Testing软件测试网Dl/XUu2X

51Testing软件测试网MBR.T(TW)`

   EMP_ID EMP_NAME                                 SALARY

&B3H#S D?Xlj0

7z I*~:r{9H Y051Testing软件测试网_2m Zp'Q

[/M#bnP&I1|U051Testing软件测试网9|}5fSj g

---------- ---------------------------------------- ----------51Testing软件测试网1@vCu z`Y[6X

;fM:b.} {K"t G[0

n8T"[8j/u~0

h7I S f/g0

        1 sunshine                                     10000

!t*T,ey d8W'D0

+f&wh9S9L&?JE0

{\E5Vmw D8A+i051Testing软件测试网0V9]v~^'x

        1 sunshine                                     1000051Testing软件测试网"@,b$pQ+D$HvFR'W i8t

8a$oP:J5neYm051Testing软件测试网"m$b1t ^5nSFUh

51Testing软件测试网8Xf0iPZsU TN]

        2 semon                                        2000051Testing软件测试网;vf1C&A$IY

51Testing软件测试网X3W J]*o/qx3v

2gsdA"Vc@ h0MV051Testing软件测试网:I"\%O9ZRf!r6K~"g

        2 semon                                        20000

,q~4P.Ps0

'q1|]8Wh}zE051Testing软件测试网6xGH]n6v5diG8X+J

51Testing软件测试网 Kg(ijP*W3mb.z

        3 xyz                                          30000

xv ZNP$Cr"Gc#c051Testing软件测试网!rGr+Zl2Z

jz#u6i Ac1p~O0

O A3YLbv9L4D0

        2 semon                                        2000051Testing软件测试网E,[;j(mB7~4G%rw

pQFV{.\ fa0

!o4?z$lG+e0

;]s/^jtd&R(U dl0

U2EQ K8I"KPo0

^NjFL0i$s0
?&V_5D8k:b2e0SQL>
selectdistinct*fromemployee;51Testing软件测试网U@yaD7v2y"cD

EyQ\F]UMN1x0

G hZFR bk051Testing软件测试网Q"v2B(Tb

*f|2U cI0

   EMP_ID EMP_NAME                                    SALARY51Testing软件测试网'O0vA;A#_3JV

C,AC9O`d[7h ~051Testing软件测试网'JJR-c/Jgf4\

51Testing软件测试网 eR-a I#O

---------- ---------------------------------------- ----------51Testing软件测试网v{/S\6Q_zOp

tU!L+l0b9G051Testing软件测试网/}O?mg5I

_f y{'ti@(D4KW0

        1 sunshine                                     1000051Testing软件测试网3C"r{ B0L o%_5h#g&K'D [

!Px!z{?}eY0

2d9V%Dv%Kj5zl051Testing软件测试网~QU8DQbU_

        2 semon                                        2000051Testing软件测试网;a!gwp2d#R h

51Testing软件测试网!R~O8\:B&X

51Testing软件测试网i@`-m$C7Yi c

uo"fAO.x$uD0

        3 xyz                                            3000051Testing软件测试网pf;D2e @

j;A3s5`:VA$NGx2ug0

g]p G/U({f051Testing软件测试网g:i z.we nf$i

51Testing软件测试网N2[-R4g ?_+ZG:k

SQL> select*fromemployeegroupbyemp_id,emp_name,salaryhavingcount(*)>151Testing软件测试网-or8nU-qK5h D

d uGAC/T#u-AfL051Testing软件测试网0`;D(Z%z pb/n

Kk-GkY&L2\+N/G0

   EMP_ID EMP_NAME                                    SALARY

}:C6~;k3n1Zv1W!j0

,V:k%`+S3L051Testing软件测试网b}!\7{k x7yh,Gf

b F$E&R5T^(IX0

---------- ---------------------------------------- ----------51Testing软件测试网;muMp+j"j2L

51Testing软件测试网:oR@"cjG9B}8_(A

51Testing软件测试网D3]-O(U6e!]t

bfJ2p9oi Sg0

        1 sunshine                                     10000

e!\;iI[,G Z051Testing软件测试网`u"^RXJ`T

51Testing软件测试网)XW"z|;giOk

"U%ZI5t9r^0

        2 semon                                         20000

f%va8{([Q0

.{ A/RQ+K a051Testing软件测试网*Cl|q v|!A h"H

51Testing软件测试网b&kqm]r?2i8V_{4p

51Testing软件测试网LH:dI^_E
SQL>
select*fromemployee e1

E#l4a(~gr0

ApgW,gI}051Testing软件测试网,k5^yj8E/jk |'MQ5Z]

i[,l Y0K$s4o0{0

whererowidin(selectmax(rowid)fromemploye e2
|9QA(ed P t5? T} X0 
wheree1.emp_id=e2.emp_idand

5]Djv&N6S051Testing软件测试网6_1C#Q^p

51Testing软件测试网x;Ed"p'ZC+~x!hob

3e-y1M"{q%~0

 e1.emp_name=e2.emp_nameande1.salary=e2.salary);51Testing软件测试网q&PJRdI6Zg@]

51Testing软件测试网4F,jtW'ba

51Testing软件测试网 f:}Ibx4N-E

51Testing软件测试网 k6V$YN$@

\5G'[_` Bw:H0 

Q&|$^}:hb8T3_0

ML O.d%O{};^s8Ec051Testing软件测试网1yE+c0d;UR

   EMP_ID EMP_NAME                                    SALARY51Testing软件测试网\$y0K{J

vO;FH5s5e(X%W051Testing软件测试网w)N J%@3q `2G7k

;s`4XTH/y0

---------- ---------------------------------------- ----------

h[nQK sJ:j1YH051Testing软件测试网6z.~`Bs#n7O#V

~I5IcrL051Testing软件测试网1WY;|0TC5te2F"U

        1 sunshine                                     10000

n}R@8~:L6Ug+P0

6TuXtbZ(W FT051Testing软件测试网?!_(E5{_6K(b*p#To

51Testing软件测试网5?-\n9RS^

        3 xyz                                           3000051Testing软件测试网` Oz_[0Mm's

'^QgD-E D |051Testing软件测试网]8o.xsC,aT$r}

*uzo`NU8l#p0

        2 semon                                        20000

z/^.eZ:}W`\0

2CvH T0pN-_G1s l0

2.删除的几种方法:51Testing软件测试网^3OtCk`8mQ3F

JYe1?}|-O051Testing软件测试网BUM,?9A$t

Q[e'F Cj-z0

51Testing软件测试网5N HDq0] Q&U u)E,G

1)通过建立临时表来实现51Testing软件测试网Hf.f2Ygz

7\.v!^M#z5t*\-WzV$S0

,P U/G:L;MS2uxY0

F/m#e q {Gw+[Z0

0}V-_W4^P0

SQL>create table temp_emp as (select distinct * from employee) 51Testing软件测试网9K0z&E8pR5`,y+iS

51Testing软件测试网/Q+eZ!y \

51Testing软件测试网$CL{N!QX)C+q/f

51Testing软件测试网-]9X!k}$}+Az'A

SQL>truncatetableemployee;(清空employee表的数据)51Testing软件测试网 kl*n[} Q

51Testing软件测试网S-DT/] | ?"X9nT

51Testing软件测试网%rR(O3K BT Z^"~#ex

:l%@N;?Pl Ai0

SQL>insertintoemployeeselect*fromtemp_emp; (再将临时表里的内容插回来)

M){#p} G%]0

EwE,^7T]0

Q*T-Xm i0

)x7jH*tH5aTy S0

,AiwJB5H8_0( 2)通过唯一rowid实现删除重复记录.Oracle中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大或最小rowid的就可以了,其余全部删除。

1O@` fy5mT0

C&e7? XH8Tx;v*@0

T'DZ7D(S5\3P4\0

4gc;he6wz:x#~0

tY _@#u#O0

SQL>deletefromemployee e2whererowidnotin(
aVx@7K6J7~b@0       
selectmax(e1.rowid)fromemployee e1 where

[7d,Y7] h }/v0

rcX3U"d!{+Q051Testing软件测试网8C"u%@ji

ysJX"h`e0

       e1.emp_id=e2.emp_idande1.emp_name=e2.emp_nameande1.salary=e2.salary);--这里用min(rowid)也可以。

;V"PE/S?"A3v0

ykw5mW D{051Testing软件测试网0Y P)f\$E!DLt

51Testing软件测试网l] z#x1q0u _+B

Z(t^0KC3J1v2nA!l^0SQL>deletefromemployee e2whererowid<(
r`2h,bm"~0       
selectmax(e1.rowid)fromemployee e1where
d8hBT Gf7B0       e1.emp_id
=e2.emp_idande1.emp_name=e2.emp_nameand

"xG1i:jV051Testing软件测试网}}W/y8O

0L y4J'X YV(M0

v4L'mWu-[051Testing软件测试网 t8mC.~Pu?b\(C]

                 e1.salary=e2.salary);51Testing软件测试网7l&hf;j$o_

51Testing软件测试网$T,W2`-Xs"_}~

'Ut(L P&G051Testing软件测试网+W XuW7^4E [#`5W

6Z@#HC1]R KJh03)也是通过rowid,但效率更高。

-iVsDmG-W9~9]051Testing软件测试网ux!M`9Q3O'Z\#D

51Testing软件测试网6E@c?7Ok

51Testing软件测试网~t-B0VBW @X

u w0dv-Y&W~l0

SQL>deletefromemployeewhererowidnotin(
5^"a"b'J@j9B0       
selectmax(t1.rowid)fromemployee t1groupby51Testing软件测试网b0KJqu W lr*f

51Testing软件测试网0z G-h zv(L9u|.R

)a8dEx&x*sv9Ep0

5E O_GX:pu0

        t1.emp_id,t1.emp_name,t1.salary);--这里用min(rowid)也可以。

U_\(D}0XG0

[/YnN)eeu051Testing软件测试网"b%`WO?"p0iJVN

51Testing软件测试网vIP2{C,n

51Testing软件测试网g.|g+OChZ F0O$K

US'mox051Testing软件测试网.v` O ud

51Testing软件测试网aS6C L5mu"Y+h9R

R'{s$T0Ns^0   EMP_ID EMP_NAME                                    SALARY

1yDD"rP CO051Testing软件测试网gu!V*?#fr

51Testing软件测试网rTs$N2u

)g#W3Xy7zIz051Testing软件测试网x5x E{^9h1R

---------- ---------------------------------------- ----------51Testing软件测试网 \-l*vYD Y

2R GgqC Zw5hs]V0

#B&V1se(T0

K or_q])a;h0

        1 sunshine                                     10000

a6mj9w3Rw1OR0

?1TT y-tH051Testing软件测试网v;b.LZ7c7Vad

51Testing软件测试网+Wu1?"oN(["D0N

        3 xyz                                           30000

:A`(\ ZEr(k051Testing软件测试网;o eD;]D2v_0J

1@$F-]%Xa]051Testing软件测试网XCvoW4N@-W

        2 semon                                        2000051Testing软件测试网%mp m4oM&}hg/W4@

@:U3[ UP051Testing软件测试网&Lj*a's$z

51Testing软件测试网vg1AAmA-x

51Testing软件测试网~"Z @"W"D;SrF

 51Testing软件测试网)[KjZqDw;egE+k

$q!y~4Uyl+g}051Testing软件测试网*W HjAV7_

51Testing软件测试网'} CH4h1vR2p-w

51Testing软件测试网aQ4w#Nc7r

"h.e Sp%}|K051Testing软件测试网:cF2w0pnx

51Testing软件测试网M EQ*\3XR3R

51Testing软件测试网)S*N%?tc&n ~{p

51Testing软件测试网+{;M1ygC[F {/f

h-}nfFs,f8[$j[051Testing软件测试网TT4z]3k+fSMt

BL h%\$B051Testing软件测试网 MmK7T v@ {E*wo&M

SQL>descemployee51Testing软件测试网Z:Z H~*ta%t

51Testing软件测试网 W:Fw+{F A.r

'{Wj'x+S;|@0

;BhZ6]5k;? m e051Testing软件测试网3p8s}*Tj0P ^K

 Name                                      Null?    Type51Testing软件测试网 x_'x\X8k
 ----------------------------------------- -------- ------------------

5JI&H#zn-|@K0

(k&AJ$A)^AV0

.}/|]gk7O;rO4xZI H0

!}Xx QRV0

emp_id                                                NUMBER(10)
w$j,N)U e3uu Bj0emp_name                                           VARCHAR2(20)51Testing软件测试网J/b D`F7CP.c3d

51Testing软件测试网C/BK8@N-nO

51Testing软件测试网+S3g%i*f9^p-c}0D@P

:w(lU._:Y(l0V2`0

salary                                                 NUMBER(10,2)51Testing软件测试网s ]FD-W| Q;T7N

a ?#|8^ ~N0
51Testing软件测试网%Mo*dUW%rd(?.nK


TAG: sql 数据库

 

评分:0

我来说两句

日历

« 2024-05-11  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 8528
  • 日志数: 14
  • 书签数: 2
  • 建立时间: 2008-03-13
  • 更新时间: 2008-11-28

RSS订阅

Open Toolbar