国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页数据库类Oracle → Oracle数据库中去除重复数据的解决方案

Oracle数据库中去除重复数据的解决方案

我要评论 2013/09/10 12:33:09 来源:国语自产精品视频在线看 编辑:zbbingyang.com [ ] 评论:0 点击:222次

在平时的开发【de kāi fā】中【zhōng】,我们经⭕常遇到数据表【shù jù biǎo】中出现【zhōng chū xiàn】重【chóng】🌷复的数据,那么该❤如何解决呢【jué ne】👠?这里介😚绍两种情况下【qíng kuàng xià】的数据去重【chóng】🕎方法💗,一🌘、完全重【chóng】🌷复数据【fù shù jù】去重【chóng】🕎;二、部分字段数据🔇重【chóng】🌷复去重【chóng】🕎。

一、完全重复数据去重方法

对于表中完全🔟重复数【chóng fù shù】据去重【jù qù chóng】,可以采【kě yǐ cǎi】👀用以下SQL语句📱。

Code

CREATETABLE"#temp"AS (SELECTDISTINCT * FROM 表名);--创建临时表【shí biǎo】,并把【bìng bǎ】🔢DISTINCT 去重后📵的数据插入到🉐临时表【shí biǎo】中【zhōng】

truncateTABLE 表名⏬;--清空原表数据【biǎo shù jù】

INSERTINTO 表名【biǎo míng】🛳(SELECT * FROM"#temp");--将临时【jiāng lín shí】表数据插入到🙍原表中

DROPTABLE"#temp";--删除临👜时表【shí biǎo】

具体思【jù tǐ sī】路是⏹,首先创建一个🌨临时表【lín shí biǎo】😴,然后将【rán hòu jiāng】😛DISTINCT之后的表数据插入到【chā rù dào】这个临🙀时表中【shí biǎo zhōng】🗄;然后清空原表数据;再讲临🚖时表中【shí biǎo zhōng】🗄的数据插入到【chā rù dào】原表中【yuán biǎo zhōng】;最后删除临时表【lín shí biǎo】😴。

二、部分数据去重方法

首先查找重复数据

select 字段【zì duàn】🐅1,字段【zì duàn】🐅2,count(*) from 表名🚹 groupby 字段【zì duàn】🐅1,字段【zì duàn】🐅2 havingcount(*) > 1

将上面的【de】>号改为=号就可🗝以查询🛄出没有重复的【chóng fù de】数据了【shù jù le】🤫。

想要删除这些【chú zhè xiē】🕸重复的数据,可以使【kě yǐ shǐ】用下面语句进【yǔ jù jìn】🔫行删除🎵:

deletefrom 表名【biǎo míng】 a where 字段🥤1,字段🥤2 in

(select 字段【zì duàn】⌛1,字段【zì duàn】⌛2,count(*) from 表名 groupby 字段【zì duàn】⌛1,字段【zì duàn】⌛2 havingcount(*) > 1)

上面的语句非【yǔ jù fēi】常简单,就是将🏦查询到的数据删除掉🛎。不过这【bú guò zhè】🥥种删除执行的效率非🌛常低【cháng dī】,对于大数据量【shù jù liàng】来说,可能会🎴将数据【jiāng shù jù】库卡死【kù kǎ sǐ】💩。

基于上述情况【shù qíng kuàng】,可以先将查询【jiāng chá xún】到的重复的数⤵据插入到一个🈵临时表💀中🚠,然后对【rán hòu duì】进行删除【chú】🔚,这样【zhè yàng】,执行删除【chú】🔚的时候就不👦用再进行一次【háng yī cì】🥅查询了。如下:

CREATETABLE 临时表【lín shí biǎo】🏒 AS

(select 字段【zì duàn】🤵1,字段【zì duàn】🤵2,count(*) from 表名 groupby 字段【zì duàn】🤵1,字段【zì duàn】🤵2 havingcount(*) > 1)

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

deletefrom 表名😲 a where 字段【zì duàn】🛸1,字段【zì duàn】🛸2 in (select 字段【zì duàn】🛸1,字段【zì duàn】🛸2 from 临时表【lín shí biǎo】);

先建临【xiān jiàn lín】时表再进行删🎃除的操【chú de cāo】作要比🎇直接用👸一条语🍈句进行【jù jìn háng】删🎃除要高【chú yào gāo】效得多。

上面的🌼语句会把所有🕤重复的全都删【quán dōu shān】除【chú】♓,在💦oracle中【zhōng】,有个隐藏了自🦁动【dòng】🕴rowid,里面给【lǐ miàn gěi】每条记录一个唯一的rowid,我们如【wǒ men rú】果想保【guǒ xiǎng bǎo】留最新【liú zuì xīn】的一条🤸记录,我们就可以利【kě yǐ lì】用这个【yòng zhè gè】字段,保留重复数据🏝中【zhōng】rowid最大的😾一条记录就可以了🦄。

下面是查询重复数据的一个例子:

select a.rowid,a.* from 表名【biǎo míng】😖 a

where a.rowid !=

(

selectmax(b.rowid) from 表名【biǎo míng】👝 b

where a.字段【zì duàn】⚽1 = b.字段【zì duàn】⚽1 and

a.字段2 = b.字段2

)

上面括号中的语句是🐛查询出📪重复数【chóng fù shù】据中🚓rowid最大的【zuì dà de】一条记🔚录。而外面【ér wài miàn】就是查询出📪除了【chú le】rowid最大之外的其【wài de qí】他重复⏰的数据【de shù jù】了。

由此👯,我们要【wǒ men yào】删除重【shān chú chóng】🐻复数据,只保留最新的🈹一条数【yī tiáo shù】据,就可以这样写😢了【le】:

deletefrom 表名【biǎo míng】🆗 a

where a.rowid !=

(

selectmax(b.rowid) from 表名【biǎo míng】🎳 b

where a.字段【zì duàn】🍊1 = b.字段【zì duàn】🍊1 and

a.字段2 = b.字段2

)

同理,上述代😕码的执行效率🃏毕竟低【bì jìng dī】,所以我【suǒ yǐ wǒ】🚪们可以【men kě yǐ】考虑建立临时表【biǎo】,将需要判断重复的字【fù de zì】段、rowid插入临时表中【shí biǎo zhōng】,然后删🎣除的时候在进🐰行比较🅾。

createtable 临时表【lín shí biǎo】🦉 as

select a.字段【zì duàn】👢1,a.字段【zì duàn】👢2,MAX(a.ROWID) dataid from 正式表 a GROUPBY a.字段【zì duàn】👢1,a.字段【zì duàn】👢2;

deletefrom 表名【biǎo míng】🗣 a

where a.rowid !=

(

select b.dataid from 临时表【lín shí biǎo】📮 b

where a.字段【zì duàn】👌1 = b.字段【zì duàn】👌1 and

a.字段2 = b.字段2

);

commit;

关键词:Oracle,数据库,解决方案

阅读本文后您有什么感想? 已有 人给出评价!

  • 1 欢迎喜欢
  • 1 白痴
  • 1 拜托
  • 1 哇
  • 1 加油
  • 1 鄙视