当前位置:  数据库>oracle

oracle sql 去重复记录不用distinct如何实现

    来源: 互联网  发布时间:2014-09-07

    本文导语:  用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会排序,效率很低 。 select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name...

用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会排序,效率很低 。
select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。
select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录
所以用distinct达不到想要的效果,用group by 可以解决这个问题。
例如要显示的字段为A、B、C三个,而A字段的内容不能重复可以用下面的语句:
select A, min(B),min(C),count(*) from [table] where [条件] group by A
having [条件] order by A desc
为了显示标题头好看点可以把select A, min(B),min(C),count(*) 换称select A as A, min(B) as B,min(C) as C,count(*) as 重复次数
显示出来的字段和排序字段都要包括在group by 中
但显示出来的字段包有min,max,count,avg,sum等聚合函数时可以不在group by 中
如上句的min(B),min(C),count(*)
一般条件写在where 后面
有聚合函数的条件写在having 后面
如果在上句中having加 count(*)>1 就可以查出记录A的重复次数大于1的记录
如果在上句中having加 count(*)>2 就可以查出记录A的重复次数大于2的记录
如果在上句中having加 count(*)>=1 就可以查出所有的记录,但重复的只显示一条,并且后面有显示重复的次数----这就是所需要的结果,而且语句可以通过hibernate
下面语句可以查询出那些数据是重复的:
select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
将上面的>号改为=号就可以查询出没有重复的数据了。
例如
代码如下:

select count(*) from (select gcmc,gkrq,count(*) from gczbxx_zhao t group by gcmc,gkrq having
count(*)>=1 order by GKRQ)
select * from gczbxx_zhao where viewid in ( select max(viewid) from gczbxx_zhao group by
gcmc ) order by gkrq desc ---还是这个可行

有一面试题说:distinct去重复的效率很底下,我在网上看到这遍文章的方法好像说是用 group by having 效率很高了?
我在了一个测试,有一商品表,26万条记录,只有商品编号建了索引,对品牌名称字段做 distinct
代码如下:

select brand,count(*) from tab_commbaseinfo group by brand having count(*) =1

平均时间是:0.453
代码如下:

select distinct brand from tab_commbaseinfo

平均时间是:0.39
搞不懂是否还有其它方法。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 不想装oracle却还要在redhat8.0下用jdbc连接oracle如何实现?
  • 那位高手知道怎样实现用JSP跟ORACLE连上?
  • oracle定时备份压缩的实现步骤
  • oracle增加表空间大小两种实现方法
  • MySQL实现类似Oracle中的decode()函数的功能
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • 老大们,虚拟机上系统os是linux,我想在它安装oracle,怎么实现?
  • 用oracle pl/sql 从A unix机器,去读取B unix机器上的一个文件,怎么实现?
  • linux上安装oracle 数据库后,是否能写shell程序实现数据库的自动启动。
  • 通过Oracle发送Email的实现方法
  • 如何实现将客户机上的word文件,以B/S方式最终存入oracle数据库?
  • oracle列合并的实现方法
  • 用java怎样实现oracle数据库表和excel数据表的转换
  • Oracle中字符串连接的实现方法
  • linux下用什么办法连接oracle数据库并且读取数据呢?(用c++代码实现时)
  • 成功实现应用程序和Oracle客户端一起打包
  • Oracle与SQLServer的实现互连
  • 实现Oracle数据库的逐渐自增
  • 读一个10M的txt文件到Oracle数据库中,用C实现,请问有什么好的方法吗?即不怎么占内存,又不怎么占Cpu!
  • 利用windows任务计划实现oracle的定期备份
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3