Oracle中distinct关键字的作用以及优化策略:

distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用

它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。

distinct 会对返回的结果集进行排序

所以会大大影响查询效率,大数据集时比较明显。所以,最好和order by

结合使用,可以提高效率 。

相信很多人在Oracle中使用distinct关键字的时候,对于查出并过滤全部一行都一样的数据轻而易举,但是如果查出并过滤掉只有一两个字段相同的,那么就得费一番力气了,下面我们看一个例子:

select distincta,b,c

from t;表t里列的顺序为c,a,b

,则distinct排序时是按前者还是后者来呢?

例子如下:

table表

字段1 字段2 id name 1 a 2 b 3 c 4 c 5 b

表结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct name from table 得到的结果是:

———-

name a b c

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

select distinct name, id from table

结果会是:

———-

id name 1 a 2 b 3 c 4 c 5 b

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,但是照样会报错。

————————————————————————————————————

下面方法可行:

select *, 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之前,不然会报错

---------------------------------------------------------更好的方法--------------------------------------------------------

第一种(效率比较低)——结合rowId:

在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,

我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。

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

select a.rowid,a.* from 表名

a

where a.rowid !=

(

select max(b.rowid) from 表名

b

where a.字段1 = b.字段1

and

a.字段2 = b.字段2

)

上面括号中的语句是查询出重复数据中rowid最大的一条记录。

而外面就是查询出除了rowid最大之外的其他重复的数据了。

由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:

delete from 表名 a

where a.rowid !=

(

select max(b.rowid) from 表名

b

where a.字段1 = b.字段1

and

a.字段2 = b.字段2

)

第二种(效率比较高)——结合临时表以及rowId:

上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。

create table

临时表 as

select

a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY

a.字段1,a.字段2;

delete from 表名

a

where a.rowid

!=

(

select b.dataid

from 临时表 b

where a.字段1 =

b.字段1 and

a.字段2 =

b.字段2

);

commit;

distenct oracle_Oracle中distinct用法相关推荐

  1. distenct oracle_oracle中distinct的用法详解

    下面先来看看例子: table表 字段1 字段2 id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. 比如我想用一条语句查询得到name ...

  2. tp 中distinct用法

    DISTINCT 方法用于返回唯一不同的值 . 例如: $Model->distinct(true)->field('name')->select(); 生成的SQL语句是: SEL ...

  3. SQL 中distinct用法详解

    转自https://blog.csdn.net/boss2967/article/details/79019467 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(disti ...

  4. distenct oracle_Oracle的distinct关键字

    distinct关键字用于从查询的结果集中筛选出唯一值的记录. 我们通过示例来介绍distinct关键字的用法. 一.生成测试数据 用以下SQL创建超女基本信息表(T_GIRL),插入一些测试数据. ...

  5. oracle中distinct用法

    1.作用于单列 select distinct name from A 2.作用于多列 select distinct name, id from A select distinct xing, mi ...

  6. hive中distinct用法

    欢迎各位关注我的个人微信公众号:赶令,将会定期更新大数据相关知识及个人心得 hive中的distinct是去重的意思,和group by在某些情况下有相同的功能 下面测试下distinct的部分功能, ...

  7. SQL中distinct用法总结

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 表B: 1.作用于单列 select dist ...

  8. distinct用法及其优化

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...

  9. COLLATE oracle,Sql 中Collate用法

    今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...

最新文章

  1. shell命令获取按键值_linux shell获取键盘输入
  2. m5310模组数据上传至onenet_NBIOT模组M5310接入中国移动物联网开放平台示例文档
  3. U3D 打包时找不到tag的问题
  4. sharepoint数据库研究
  5. 《PHP和MySQL Web开发从新手到高手(第5版)》一一第1章 安装
  6. 应用软件系统程序员的三个立面
  7. jquery-jquery对向与dom标签对向
  8. numactl:NETLINK示例源码
  9. Web API-DOM节点操作
  10. Mac使用技巧:清除 MacBook 上的浏览器缓存
  11. java 线程池_Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析
  12. Git项目下载部分文件或文件夹
  13. 基于Hadoop技术进行地理空间分析
  14. 《数字货币与人民币国际化》读书笔记1
  15. 【转载】正则表达式好文【30分钟教程】
  16. mysql--sql中双引号 单引号' 反单引号`的作用和区别
  17. 简易平滑轮播(纯CSS)
  18. 雍正杀“舅”:握着领导把柄,隆科多必须死?
  19. /etc/xinetd.d 的使用
  20. 微信小程序---获取输入框(input)内容

热门文章

  1. (转)我是怎么治愈鼻窦炎的
  2. Navicat 创建表时候,报 1075错误
  3. 【精华】搭建个人Web服务器_NGHG
  4. 跨境电商如何向国外出售商品?流程详细讲解-跨境知道
  5. python 仪表数字识别_利用Python进行数字识别
  6. jquery.fancybox图片预览组件使用整理_fancyBox3使用整理
  7. 白金奖设计作品:给你一支笔,你便是艺术家
  8. 超赞的60 个神级 VS Code 插件!
  9. 3d几何图形为什么会有茶壶_[深入研究]什么是G3D几何交换格式?
  10. 假如有一次重来的机会,你选择做一位硬件工程师还是软件工程师?