Oracle数据库中去除重复数据的解决方案
在平时的开发【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