Oracle数据库重复数据删除的几种方法

Oracle数据库重复数据删除的几种方法,第1张

重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。Oracle数据库重复数据删除技术有如下优势:更大的备份容量、数据能得到持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。

一、删除部分字段重复数据先来谈谈如何查询重复的数据吧。

下面语句可以查询出那些数据是重复的:

select

字段1,字段2,count(*)

from

表名

group

by

字段1,字段2

having

count(*)

>

1

将上面的>号改为=号就可以查询出没有重复的数据了。

想要删除这些重复的数据,可以使用下面语句进行删除

delete

from

表名

a

where

字段1,字段2

in

(select

字段1,字段2,count(*)

from

表名

group

by

字段1,字段2

having

count(*)

>

1)

上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:

CREATE

TABLE

临时表

AS

(select

字段1,字段2,count(*)

from

表名

group

by

字段1,字段2

having

count(*)

>

1)

上面这句话就是建立了临时表,并将查询到的数据插入其中。

下面就可以进行这样的删除 *** 作了:

delete

from

表名

a

where

字段1,字段2

in

(select

字段1,字段2

from

临时表)

这种先建临时表再进行删除的 *** 作要比直接用一条语句进行删除要高效得多。

这个时候,大家可能会跳出来说,什么?你叫我

法一:

用Group

by语句

此查找很快的select

count(num),

max(name)

from

student

–查找表中num列重复的,列出重复的记录数,并列出他的name属性group

by

numhaving

count(num)

>1

–按num分组后找出表中num列重复,即出现次数大于一次delete

from

student(上面Select的)这样的话就把所有重复的都删除了。—–慎重法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法:—-

执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录SELECT

*

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

D

–D相当于First,SecondWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)—-

执行下面SQL语句后就可以删除所有DRAWING和DSNO相同且重复的记录DELETE

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

DWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)法一:

用Group

by语句

此查找很快的select

count(num),

max(name)

from

student

–查找表中num列重复的,列出重复的记录数,并列出他的name属性group

by

numhaving

count(num)

>1

–按num分组后找出表中num列重复,即出现次数大于一次delete

from

student(上面Select的)这样的话就把所有重复的都删除了。—–慎重法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法:—-

执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录SELECT

*

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

D

–D相当于First,SecondWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)—-

执行下面SQL语句后就可以删除所有DRAWING和DSNO相同且重复的记录DELETE

FROM

EM5_PIPE_PREFABWHERE

ROWID!=(SELECT

MAX(ROWID)

FROM

EM5_PIPE_PREFAB

DWHERE

EM5_PIPE_PREFAB.DRAWING=D.DRAWING

ANDEM5_PIPE_PREFAB.DSNO=D.DSNO)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6874370.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-29
下一篇2023-03-29

发表评论

登录后才能评论

评论列表(0条)

    保存