仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 765|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计在Oracle中怎样删除表中计划反复数据

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:31:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
MySQLAB公司的一个高级开发者者表示,“这个特点使得MySQL可以根据你当前的系统的需要来进行调整。”oracle|计划|数据|反复我们大概会呈现这类情形,某个表本来计划不全面,招致内外面的数据数据反复,那末,怎样对反复的数据举行删除呢?

反复的数据大概有如许两种情形,第一种时表中只要某些字段一样,第二种是两行纪录完整一样。

1、关于部分字段反复数据的删除

先来谈谈怎样查询反复的数据吧。

上面语句能够查询出那些数据是反复的:
  1. select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1
复制代码

将下面的>号改成=号就能够查询出没有反复的数据了。

想要删除这些反复的数据,可使用上面语句举行删除
  1. deletefrom表名awhere字段1,字段2in(select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1)
复制代码

下面的语句十分复杂,就是将查询到的数据删撤除。不外这类删除实行的效力十分低,关于年夜数据量来讲,大概会将数据库吊逝世。以是我倡议先将查询到的反复的数据拔出到一个一时表中,然后对举行删除,如许,实行删除的时分就不必再举行一次查询了。以下:
  1. CREATETABLE一时表AS(select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1)
复制代码

下面这句话就是创建了一时表,并将查询到的数据拔出个中。

上面就能够举行如许的删除操纵了:
  1. deletefrom表名awhere字段1,字段2in(select字段1,字段2from一时表);
复制代码

这类先建一时表再举行删除的操纵要比间接用一条语句举行删除要高效很多。

这个时分,人人大概会跳出来讲,甚么?你叫我们实行这类语句,那不是把一切反复的全都删除吗?而我们想保存反复数据中最新的一笔记录啊!人人不要急,上面我就讲一下怎样举行这类操纵。

在oracle中,有个埋没了主动rowid,内里给每笔记录一个独一的rowid,我们假如想保存最新的一笔记录,

我们就能够使用这个字段,保存反复数据中rowid最年夜的一笔记录就能够了。

上面是查询反复数据的一个例子:
  1. selecta.rowid,a.*from表名awherea.rowid!=(selectmax(b.rowid)from表名bwherea.字段1=b.字段1anda.字段2=b.字段2)
复制代码

上面我就来说解一下,下面括号中的语句是查询出反复数据中rowid最年夜的一笔记录。

而表面就是查询出除rowid最年夜以外的其他反复的数据了。

由此,我们要删除反复数据,只保存最新的一条数据,就能够如许写了:
  1. deletefrom表名awherea.rowid!=(selectmax(b.rowid)from表名bwherea.字段1=b.字段1anda.字段2=b.字段2)
复制代码

任意说一下,下面语句的实行效力是很低的,能够思索创建一时表,讲必要判别反复的字段、rowid拔出一时表中,然后删除的时分在举行对照。
  1. createtable一时表asselecta.字段1,a.字段2,MAX(a.ROWID)dataidfrom正式表aGROUPBYa.字段1,a.字段2;deletefrom表名awherea.rowid!=(selectb.dataidfrom一时表bwherea.字段1=b.字段1anda.字段2=b.字段2);commit;
复制代码

2、关于完整反复纪录的删除

关于表中两行纪录完整一样的情形,能够用上面语句猎取到往失落反复数据后的纪录:
  1. selectdistinct*from表名
复制代码

能够将查询的纪录放光临时表中,然后再将本来的表纪录删除,最初将一时表的数据导回本来的表中。以下:
  1. CREATETABLE一时表AS(selectdistinct*from表名);droptable正式表;insertinto正式表(select*from一时表);droptable一时表;
复制代码

假如想删除一个表的反复数据,能够先建一个一时表,将往失落反复数据后的数据导进光临时表,然后在从一时表将数据导进正式表中,以下:
  1. INSERTINTOt_table_bakselectdistinct*fromt_table;
复制代码
“通过有能力的DBA的一个简单计划,MySQL可以达到令人难以想像的运行速度,”一位资深DBA如此表示。MySQL中没有多余的功能来拖累CPU或占用内存。
admin 该用户已被删除
9#
发表于 2015-3-23 18:13:28 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
简单生活 该用户已被删除
8#
 楼主| 发表于 2015-3-17 03:18:48 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
金色的骷髅 该用户已被删除
7#
发表于 2015-3-10 00:23:10 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
不帅 该用户已被删除
6#
发表于 2015-2-28 15:05:36 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
5#
发表于 2015-2-10 01:56:33 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
爱飞 该用户已被删除
地板
发表于 2015-2-4 14:14:37 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-26 10:10:11 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
海妖 该用户已被删除
沙发
发表于 2015-1-19 16:10:12 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-20 17:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表