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

临时表);

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

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

当我们用navicat工作时,会出现Duplicate entry "1" for key "PRIMARY"的错误,网上有很多解决的办法,我这里有两个解决方法,希望对你们有用。

1,“primary”顾名思义是主键的问题,可以将这张表设为无主键,就是把主键给删了不要了,但是这种方法不怎么好用,存在一些bug,而且大部分数据表都是需要主键的,所以不太推荐大家使用这种方法。

2,因为主键(primary)是唯一的,但我们点击刷新或运行的时候,系统就会认为我们又创建一个主键,导致出错,解决办法:我们可以输入“DELETE FROM Table_name”,delete语句是MySQL常用的删除 *** 作,我们可以用它删除表中的所有记录,delete语句运行之后,这样所有的记录全部删除了,我们可以再重新在设一个主键,就OK了,切记我们不要频繁的点击刷新和运行,要当我们代码写得差不多了,再点击刷新或运行,不然还会出现这种问题,不过用delete语句就可以了,只要你不嫌麻烦就行。

第一次写文章,我是很想帮助大家,仅拼个人理解,第二个方法是和同学们交流学习得来的,所以一些不足之处,希望大家多多担待。谢谢!

表里只有两列??如果是可以这样做

1、select region,store_name into Geography_bak from Geography group by region,store_name

--去掉重复记录的数据写在一个备份表中

2、删除原表的记录。

delete from Geography

3、将没有重复记录的数据插回原表。

insert Geography select from Geography_bak

4、删除备份表

drop table Geography_bak

MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考。

第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表

1 create table tmp3 as select min(id) as col1 from data_content_152 group by SFZHM;

第二步:创建新表RES

1234 CREATE TABLE `res` (`id` int(11),`sfz` char(20)) ENGINE=MyISAM;

第三步:把TMP3表ID对应到data_content_152里需要提取的数据添加到RES表的SFZ字段

1 INSERT INTO res (sfz) SELECT sfzhm FROM data_content_152,tmp3 where data_content_152id=tmp3col1

至此,就在MYSQL里实现了,给数据表data_content_152完全删除重复数据,把去重复后的数据导入到RES表。

如何查找和删除数据库中的重复数据

以Excel2010版本为例,可以直接使用数据→删除重复项的功能来实现删除重复数据。

此功能Excel2007及以上版本均可,WPS中也有这样的功能。另外还可以使用公式法去重复,常用的函数是Countif函数。

这个问题就是要删除表中重复的记录,查询的sql语句如下:\x0d\select id,name from (\x0d\select id,name,row_numer() over(partition by id,name order by id,name) rn from tableA)\x0d\where rn>1;\x0d\删除的sql语句如下:\x0d\DELETE tableA WHERE ROWNUM = (SELECT ROWNUM\x0d\ FROM (SELECT id,name,\x0d\ ROW_NUMBER() OVER(PARTITION BY id,name ORDER BY id,name) RN\x0d\ FROM tableA )\x0d\ WHERE RN > 1);

首先是将数据库里边的重复记录删掉,我看网上有好多答案是这样的:

1 delete from people

2 where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

3 and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

但其实我每次运行这条语句都是行不通的,会报错:

SQL 错误 [1093] [HY000]: You can't specify target table 'test1' for update in FROM clause

javasqlSQLException: You can't specify target table 'test1' for update in FROM clause

去网上查过好像是说update以及delete *** 作没办法跟查询 *** 作一起做的,我看过有的更新的跟查询的一起做的好像是给查出来的那部分起个别名,然后进行更新就可以了,但是删除这个我起了别名也不对,不知道是我写错还是不行,我就跳过这个方法了。

我用的方法是:先查出数据库中的重复记录的数据中的一条,这个不难,很简单的,sql语句如下:

select from test1 where name in (select  name from test1  group  by  name   having  count(name) > 1)

and id in (select min(id) from  test1  group by name  having count(name)>1)

结果如下:

id |name |phont |

---|--------|-------|

1 |name22 |123 |

3 |name222 |123 |

5 |name2 |123123 |

8 |123 |123123 |

11 |name1 |123123 |

13 |111 |1231 |

14 |112 |1232 |

这些都是不重复的,换句话说都是要保留的,不被删掉的,而其余与这些结果中name相同的应该被删掉。

也就是说将上边那个sql语句id后边加一个not ,查出来的结果就是要删掉的:结果如下

id |name |phont |

---|--------|-------|

2 |name22 |123 |

4 |name222 |123 |

6 |name2 |123123 |

7 |name2 |NULL |

9 |123 |123123 |

10 |123 |123123 |

12 |name1 |123123 |

15 |111 |1233 |

16 |112 |1234 |

17 |111 |1235 |

18 |112 |1236 |

我把这些需要删掉的存到另外一个表里,然后我新建一个test2表,结构复制test1的结构就好了

1 CREATE TABLE `test2` (2   `id` int(11) NOT NULL AUTO_INCREMENT,3   `name` varchar(50) DEFAULT NULL,4   `phont` varchar(50) DEFAULT NULL,5   PRIMARY KEY (`id`)6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

然后插入语句是:

1 insert into test2(2 select from testtest1 where name in (select  name from testtest1  group  by  name   having  count(name) > 1)

3 and id not in (select min(id) from  testtest1  group by name  having count(name)>1)

4 )

然后test2的表里的数据就是下图这样的:

那接下来做的就是删掉test1表里边与test2表的id相同的数据。

1 delete a from test1 a, test2 b where aid = bid ;

这样,test1里边的数据就变成了:

这样的结果就是完全不重复的,但是我还想要他们的id是连续的,而不是这样的断开的。

我的做法是将这个表的除掉id之外的所有字段查出插入到另外一个表test3中,当然,test3要设置id为自增主键,但是不插入id,让它自增,就连续了

当然要新建表test3啦,不过把上边新建的test2那个复制下来改名字为test3就好啦。

然后插入:

1 insert into test3(name, phont)2 (select name, phont from test2)

test3表里的结果就是:

这样就可以把test3改成你想要的名字,然后删掉test1和test2了,大功告成~

不过感觉还可以就是将已经删掉重复数据的表test1的数据全都导出来,一般的数据库连接工具都有这样的功能,导成sql格式的,然后新建一个表,比test1多增一个自增主键字段叫NewId字段,但是Id字段不能再自增了,然后将导成的sql文件导入,不过那个sql文件可能要编辑一下,改一下自增主键id变为普通的字段什么的,然后到新表了之后,删掉id字段,修改NewId为Id,应该也可以,但是这个方法我没试过,原先预想过要这么做但是没有这么做,估计以后可以试试,但是感觉两种的麻烦程度都差不多啊,但是如果将sql语句写下来之后可能还是第一种方法比较快一点吧。

以上就是关于Oracle数据库重复数据删除的几种方法全部的内容,包括:Oracle数据库重复数据删除的几种方法、怎么用navicat删除数据表中的重复值、数据库删掉重复数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/sjk/9278922.html

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

发表评论

登录后才能评论

评论列表(0条)

保存