`

oracle distinct 多列

 
阅读更多
distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是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
结果:

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

依然报错,

group by 必须放在 order by 和 limit之前,不然会报错

------------------------------------------------------------------------------------------------------------

偶认为这样可行
select max(id), name from table group by name;

结果:
id name
1  a
2  b
4  c
5  d

参考资料:
http://www.cnblogs.com/dogxuefeng/archive/2012/06/21/2557700.html
http://stevenfeng.iteye.com/blog/841793
http://eric-yan.iteye.com/blog/1749440

分享到:
评论

相关推荐

    完美解决distinct中使用多个字段的方法

    完美解决distinct中使用多个字段的方法,完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法

    oracle优化笔记

    以 d 打头的记录后, ORACLE 就停止遍历了!为啥,因为索引是有序的,当出现 d 打头的 记录后,绝对后面不可能再出现 c 打头的记录了,因为我们是查询=cc 的值,当然停住了。 随时停止检索相比遍历全表,明显是少...

    oracle从入门到精通

    9、DISTINCT .................................................................................................................................10 1.5、SQLPLUS 与 SQL 的关系 ............................

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...

    Oracle数据库Sql性能调优

    1.22 用EXISTS替换DISTINCT 13 1.23 识别’低效执行’的SQL语句 14 1.24 用索引提高效率 14 1.25 索引的操作 15 1.26 多个平等的索引 16 1.27 等式比较和范围比较 17 1.28 不明确的索引等级 17 1.29 强制索引失效 18...

    Oracle从入门到精通

    9、DISTINCT .............................................. 1.5、SQLPLUS 与 SQL 的关系................................ 1、SQLPLUS命令的功能: ................................... 2、查询 SQLPLUS 命令......

    oracle培训资料

    连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接...

    oracle数据库经典题目

    1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程。 2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。 3.在需要滤除查询结果中重复的行时,必须...

    Oracle创建视图(View)

    WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不...

    pivot:将Oracle数据库中的数据透视到一个或多个实例化视图

    枢轴(Oracle) 在指定的实例化视图中将无限数量的列行旋转到一列中。使用运行项目或将其关联为要透视的行创建为jar,并带有关联的属性文件。 java -jar pivot.jar TXN_SHIPPED_ITEM.properties已知的问题根本不处理...

Global site tag (gtag.js) - Google Analytics