Oracle中distinct的用法实例以及Oracledistince用法和删除重复数据

更新时间:2023-07-11 18:44:49 阅读: 评论:0

智能化产品Oracle中distinct的⽤法实例以及Oracledistince⽤法和删除重
复数据
Oracle中distinct的⽤法实例
摘要:
此外,distinct 会对返回的结果集进⾏排序 所以会⼤⼤影响查询效率,⼤数据集时⽐较明显 。所以,最好和order by 结合使⽤,可以提⾼效率 。
lect  distinct  a,b,c from t;表t⾥列的顺序为c,a,b ,则distinct 排序时是按前者还是后者来呢?
distinct这个关键字来过滤掉多余的重复记录只保留⼀条,但往往只⽤ 它来返回不重复记录的条数,⽽不是⽤它来返回不重记录的所有值。其原因是distinct只有⽤⼆重循环查询来解决,⽽这样对于⼀个数据量⾮常⼤的站来说,⽆疑是会直接影响到效率的。
下⾯先来看看例⼦:
table表
字段1    字段2
id        name
1          a
2          b
3          c
4          c
5          b
表结构⼤概这样,这只是⼀个简单的例⼦,实际情况会复杂得多。
⽐如我想⽤⼀条语句查询得到name不重复的所有数据,那就必须使⽤distinct去掉多余的重复记录。
lect distinct name from table
得到的结果是:
——-
name好奇的近义词是什么
a
b
c
好像达到效果了,可是,我想要得到的是id值呢?改⼀下查询语句吧:
lect distinct name, id from table
结果会是:
———-
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么没起作⽤?作⽤是起了的,不过他同时作⽤了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。
我们再改改查询语句:
lect id, distinct name from table
很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件⾥?能,但是照样会报错。————————————————————————————————————
下⾯⽅法可⾏:
lect *, count(distinct name) from table group by name
结果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最后⼀项是多余的,不⽤管就⾏了,⽬的达到。。。。。
group by 必须放在 order by 和 limit之前,不然会报错
===========================================================
另⼀篇⽹上转载的博⽂:
Oracle distince ⽤法和删除重复数据
oracle distinct语句的⽤法 创建视图时过滤数据
distinct的只显⽰⼀次重复出更的值。
不过这个值出现多少次只显⽰⼀次。十丈
lect distinct 字段名1,字段名2 from 表格 order by 字段名1
distinct 字段名1 意思是只显⽰⼀次字段名1显⽰的是第⼀次出现的。
最好和order by 结合使⽤。可以提⾼效率
distinct 返回唯⼀的结果集
注意,是结果集,如果你选了N个字段,当N个字段都相同时
才会被视为相同,⽽只返加⼀个
当然,如果N=1的话,情况就会⽐较明显
此外,distinct 会对返回的结果集进⾏排序 所以会⼤⼤影响查询效率,⼤数据集时⽐较明显
lect distinct hjrq from T_MIDDLE_HJCG order by hjrq
asc 增序 默认
desc 降序
Oracle 中如何删除重复数据
我们可能会出现这种情况,某个表原来设计不周全,导致表⾥⾯的数据数据重复,那么,如何对重复的数据进⾏删除呢?
重复的数据可能有这样两种情况,第⼀种时表中只有某些字段⼀样,第⼆种是两⾏记录完全⼀样。
⼀、对于部分字段重复数据的删除
先来谈谈如何查询重复的数据吧。
下⾯语句可以查询出那些数据是重复的:
lect 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
将上⾯的>号改为=号就可以查询出没有重复的数据了。
想要删除这些重复的数据,可以使⽤下⾯语句进⾏删除
delete from 表名 a where 字段1,字段2 in
(lect 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
上⾯的语句⾮常简单,就是将查询到的数据删除掉。不过这种删除执⾏的效率⾮常低,对于⼤数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插⼊到⼀个临时表中,然后对进⾏删除,这样,执⾏删除的时候就不⽤再进⾏⼀次查询了。如下:
CREATE TABLE 临时表 AS
(lect 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
作文
上⾯这句话就是建⽴了临时表,并将查询到的数据插⼊其中。
下⾯就可以进⾏这样的删除操作了:
delete from 表名 a where 字段1,字段2 in (lect 字段1,字段2 from 临时表);
这种先建临时表再进⾏删除的操作要⽐直接⽤⼀条语句进⾏删除要⾼效得多。
这个时候,⼤家可能会跳出来说,什么?你叫我们执⾏这种语句,那不是把所有重复的全都删除吗?⽽我们想保留重复数据中最新的⼀条记录啊!⼤家不要急,下⾯我就讲⼀下如何进⾏这种操作。
简单的动漫画
在oracle中,有个隐藏了⾃动rowid,⾥⾯给每条记录⼀个唯⼀的rowid,我们如果想保留最新的⼀条记录,
我们就可以利⽤这个字段,保留重复数据中rowid最⼤的⼀条记录就可以了。
下⾯是查询重复数据的⼀个例⼦:
wid,a.* from 表名 a
wid !=
(
lect wid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 =
b.字段2
)
下⾯我就来讲解⼀下,上⾯括号中的语句是查询出重复中rowid最⼤的⼀条记录。
⽽外⾯就是查询出除了rowid最⼤之外的其他重复的数据了。
由此,我们要删除重复数据,只保留最新的⼀条数据,就可以这样写了:
delete from 表名 a
wid !=
(
lect wid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 =
b.字段2
)
随便说⼀下,上⾯语句的执⾏效率是很低的,可以考虑建⽴临时表,讲需要判断重复的字段、rowid插⼊临时表中,然后删除的时候在进⾏⽐较。
create table 临时表 as
lect a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a
wid !=
(
lect b.dataid from 临时表 b
高中必背成语
where a.字段1 = b.字段1 and
镇元大仙诨号a.字段2 =
b.字段2
);
commit;
⼆、对于完全重复记录的删除
对于表中两⾏记录完全⼀样的情况,可以⽤下⾯语句获取到去掉重复数据后的记录:
lect distinct * from 表名
可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下: CREATE TABLE 临时表 AS (lect distinct * from 表名);
drop table 正式表;
inrt into 正式表 (lect * from 临时表);
drop table 临时表;
如果想⼀个表的重复数据,可以先建⼀个临时表,将去掉重复数据后的数据导⼊到临时表,然后在从
临时表将数据导⼊正式表中,如下:星星梦
INSERT INTO t_table_bak
lect distinct * from t_table;

本文发布于:2023-07-11 18:44:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1077376.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   查询   删除   可能   语句   字段
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图