教你删除Oracle数据库中重复没用的数据 3 @1 W, P/ ]% y4 V3 w8 W
在对数据库进行操作过程中我们可能会碰到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来很多的不便,那么怎么删除这些重复没有用的数据呢?
& J( k; c$ C- q1 X) Z
4 Q E: N! a/ A 重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证,进步数据恢复服务水平,方便实现数据容灾等。 重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。Oracle数据库重复数据删除技术有如下优势:更大的备份容量、数据能得到持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。 . E) w9 r' t5 a" r8 h$ s5 N% ]
, L# ? _( D" O: f0 }# K一、删除部分字段重复数据
2 {3 `) ?4 ]# T( V$ s: m- x 先来谈谈如何查询重复的数据吧。
" M* k" r. p+ E 下面语句可以查询出那些数据是重复的: / S3 R. M# b5 L
select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1 k) j2 G5 i8 A6 [: I* u
将上面的>号改为=号就可以查询出没有重复的数据了。 ) }2 J% a' P. a' ~
想要删除这些重复的数据,可以使用下面语句进行删除
( q: e! ^( f/ s delete from 表名 a where 字段1,字段2 in
: y5 T" C! b2 s3 g8 U+ _ (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
; m# a/ L4 I3 ?& a: ~2 T; i" B p* k5 E# y
上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个暂时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:
2 ^8 V% ]+ y2 r7 r# F5 [9 J; y L3 ^" F7 _) c
create TABLE 暂时表 AS
6 O' x/ d/ z! Z! A' f (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
" i8 ^' e j) R4 T0 J# o$ O 上面这句话就是建立了暂时表,并将查询到的数据插入其中。
( C1 B6 n% |5 }
3 l. U: i% P" A- R, T 下面就可以进行这样的删除操作了:
7 q3 `: S& e' | delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 暂时表); - G$ U( i# [$ T1 h# D
这种先建暂时表再进行删除的操作要比直接用一条语句进行删除要高效得多。 # A9 ]& i) @$ ~6 p
这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。
! T% \% J) u: Y9 Y5 P4 v4 [, [) d' C- i9 D3 q) [/ m
在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们假如想保留最新的一条记录, 1 K1 a8 z4 K/ d# s6 x& }0 H5 r
6 n! E$ y' X2 c9 ]5 {& ^' W$ M 我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。 9 n# ^$ E/ I8 W1 q# g7 ^) g
下面是查询重复数据的一个例子:
( |7 ^8 O$ Q0 @: g& g% k 以下是引用片段: & B$ A+ D" h+ i R& `! g+ M
selecta.rowid,a.*from表名a ! A6 y9 z8 [& k4 l4 Z
wherea.rowid!= . O" l% c0 _1 j: T# \ |
(
! `( d# q! j+ n; {) o4 I selectmax(b.rowid)from表名b / O" p# l$ O2 |, F
wherea.字段1=b.字段1and 6 D9 r2 x# f) ~% P1 S; D0 s$ C% \/ T! l1 v
a.字段2=b.字段2
6 X) k& j: F- E )
, T1 B5 C/ v; w* t
; ? b2 n* P2 j/ D 下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。 * r# J6 U" \# Y- g8 F6 g
而外面就是查询出除了rowid最大之外的其他重复的数据了。 1 f$ s. x5 g$ a0 \& o$ H
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
4 C( i8 g; N/ r- s deletefrom表名a
* o' M9 e: p, k" g( W+ a wherea.rowid!=
/ H4 W/ n7 c2 T: K \" n: P9 K ( : r9 e3 _! @2 c2 x
selectmax(b.rowid)from表名b 4 S# K5 g6 v8 T n" P8 |! g F! e
wherea.字段1=b.字段1and
' P+ u& Y* K% f0 j0 U3 f0 `0 ^ a.字段2=b.字段2 3 c. j& \( k1 N) V: \6 S0 [% j% a A
) / N1 ^! o/ A' x/ R4 X1 n
+ ]4 P8 r5 A4 X$ E. T 随便说一下,上面语句的执行效率是很低的,可以考虑建立暂时表,讲需要判定重复的字段、rowid插入暂时表中,然后删除的时候在进行比较。
7 u4 |9 a# v& z/ t, }2 g createtable暂时表as
0 q! B, `3 t# x8 D$ f; Z1 `. ^; l selecta.字段1,a.字段2,MAX(a.ROWID)dataidfrom正式表aGROUPBYa.字段1,a.字段2; $ {! |' \3 @+ P V; |( s6 e$ w
deletefrom表名a + l* D( b% ]2 A8 H
wherea.rowid!= 0 r; d* C6 r. E$ L' d. T# k, h5 `
( % i0 a4 a0 [0 F
selectb.dataidfrom暂时表b
& y% }6 i$ r7 J% \4 U wherea.字段1=b.字段1and % z; o7 D9 _& B! F7 Y
a.字段2=b.字段2 7 ?- c5 O1 `7 s9 W! m2 O1 y
); * `1 [, K5 t$ j7 K3 Y/ n
commit;
7 K3 b9 O; q+ B4 C, S4 w9 F
% d& x B: o0 w& W# R+ o二、完全删除重复记录 4 @& r" X0 ]. s1 T" t# G$ X
对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:
8 [0 r, t& U/ y4 I select distinct * from 表名
; S, h5 F) b9 b1 G 可以将查询的记录放到暂时表中,然后再将原来的表记录删除,最初将暂时表的数据导回原来的表中。如下: 9 C4 X# h# s6 k) z- d- _$ B
createTABLE暂时表AS(selectdistinct*from表名); " E3 H2 h' l4 o
truncatetable正式表;--注:原先由于笔误写成了droptable正式表;,现在已经改正过来 ( f/ Y2 F5 b: o- e
insertinto正式表(select*from暂时表);
# `4 F# a) S9 w4 E9 f droptable暂时表;
9 y% G! c7 B+ u4 I- Q% c4 I 假如想删除一个表的重复数据,可以先建一个暂时表,将去掉重复数据后的数据导入到暂时表,然后在从暂时表将数据导入正式表中,如下: / I% J( u; w: s- Y P2 p
insertINTOt_table_bak
4 X6 z& A1 f+ m) X1 W& L( G selectdistinct*fromt_table; ' V+ M9 i1 ^; I H
8 q2 v. L! m* M5 b0 J' _
三、怎样快速删除oracle数据库
/ v+ s7 O, v5 G6 u' P/ j, J5 c. Z 最快的方法就进入注册表 在运行..里输入regedit. 9 \! p0 I/ E6 e/ K( X, j8 f
依次展开HKEY_LOCAL_MACHINE SOFTWARE
- @/ ], P7 ?1 z l* `$ X 找到ORACLE节点。删除。 1 }; F9 y l+ y. O7 T# x3 k) L- n
然后删除ORACLE数据文件,安装的时候选的路径。 3 U: f0 }, `% c; O
最初删除oracle引导文件,在系统盘符的Program Files 里面删除oracle文件夹。 |