`

消除重复记录oracle distinct

阅读更多
    http://hi.baidu.com/homappy/item/5f7ae3b8931544eb4ec7fd38
用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  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

ps: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

结果:

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

最后一项是多余的,不用管就行了,目的达到。。。。。

group by 必须放在 order by 和 limit之前,不然会报错
=====================================以上是关于oracle的distinct的一种用法========================================
用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会排序,效率很低。

select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。
select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录
所以用distinct达不到想要的效果,用group by   可以解决这个问题。
分享到:
评论

相关推荐

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

    select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。 select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录 所以用distinct达...

    distinct的使用.docx

    在Oracle数据库中,`DISTINCT`操作可能会影响查询性能,因为它需要对结果进行额外的处理以消除重复项。在大数据量的表上使用`DISTINCT`时,应考虑其潜在的性能影响,并可能需要使用索引来优化查询。 另外,`...

    Oracle期末复习题(带答案)

    在SELECT语句中使用DISTINCT关键字可以去除结果集中的重复行。HAVING子句用于对分组后的数据进行条件筛选,而不能单独使用,必须与GROUP BY子句一起使用。SUM、COUNT、MAX、MIN等是常用的聚合函数,用于执行数据的...

    SQL对冗余数据的删除重复记录只保留单条的说明

    在SQL中,处理重复记录的一个常见方法是使用`DISTINCT`关键字。例如,可以创建一个临时表`#Tmp`,存储`tableName`中的唯一记录: ```sql SELECT DISTINCT * INTO #Tmp FROM tableName; DROP TABLE tableName; ...

    oracle常用的数据库脚本

    我们将深入探讨Oracle数据库中去除重复记录的方法。 在Oracle中,面对重复数据时,我们通常有以下几种处理策略: 1. **DISTINCT关键字**: 在查询数据时,可以使用DISTINCT关键字来去除结果集中的重复行。例如: ...

    oracle 删除重复数据

    1. **查询去重记录**:`DISTINCT`关键字可以用于消除所有字段完全相同的重复记录。例如: ```sql SELECT DISTINCT * FROM t_table; ``` 2. **数据迁移**:为了安全起见,通常我们会将去重后的数据保存到临时表,...

    oracle数据库教案

    若想查询每位雇员的职位并消除重复数据,可以使用`DISTINCT`关键字: ``` SELECT DISTINCT job FROM emp; ``` 通过上述内容,我们不仅掌握了Oracle数据库的基本结构和操作,还深入了解了SQL语言的核心概念及其在...

    Oracle SQL最佳实践

    #### 一、使用 EXISTS 代替 DISTINCT 消除排序操作 在进行数据查询时,为了去除结果集中的重复行,我们通常会使用 `DISTINCT` 关键字。然而,在某些场景下,这种方法可能会导致不必要的排序操作(`SORT OPERATION`...

    Oracle教程.docx

    * DISTINCT:消除查询输出中的重复行 * WHERE:指定过滤条件 * AND:组合两个或两个以上的布尔表达式 * OR:组合两个或两个以上的布尔表达式 * FETCH:使用行限制子句限制查询返回的行数 * IN:确定值是否与...

    ORACLE__SQL语句教学

    - `DISTINCT`:可选关键字,用于消除重复行。 - `column`:表中的列名。 - `expression`:基于列的计算表达式。 - `alias`:为列名或表达式提供别名。 - `FROM`:指定要从其中检索数据的表。 #### 四、执行基本的...

    DOC命令操作oracle数据库

    消除重复行,可以使用`distinct`关键字: ```sql select distinct deptno from emp; ``` 查看表结构的命令是`desc`: ```sql desc 表名; ``` 清空控制台屏幕可以使用`host cls`(这可能依赖于你的终端环境)。 ...

    oracle学习笔记1

    `DISTINCT`关键字用于消除结果集中的重复项,如`SELECT DISTINCT deptno FROM emp`将返回`emp`表中不重复的部门编号。`WHERE`子句用于设定查询条件,例如`SELECT * FROM emp WHERE ename='CLIRK'`会返回名字为'CLIRK...

    oracle数据库函数

    - **DISTINCT**: 用于消除查询结果中的重复记录,只返回唯一值。这对于数据分析特别有用,可以帮助快速获取数据集合中的不同值。 ### 5. DUAL 表 - **DUAL**: Oracle 数据库中的一个特殊表,常用于测试 SQL 函数...

    oracle查询语句大全

    - **消除重复行**: - `SELECT DISTINCT 列名 FROM 表名;` - **使用WHERE语句查询**: - `SELECT * FROM 表名 WHERE 条件 ORDER BY 列名;` - `SELECT * FROM 表名 WHERE 条件 ORDER BY 列名 DESC;` — 按降序排列 ...

    oracle简单笔记

    `DISTINCT`关键字用于消除重复记录,如`SELECT DISTINCT job FROM emp_xxx;`可获取所有不同的职位名称。 大小写敏感性在SQL语句中通常被忽略,但在数据中却很重要。`LOWER()`和`UPPER()`函数可分别将字符转换为小写...

    OracleSql脚本书写规范

    如果不需要消除重复行,使用UNION-ALL代替UNION可以节省去重的时间开销。 **15. 用索引提高效率** 正确创建和使用索引可以显著提高查询速度。了解索引类型(B树、位图、函数索引等),针对查询模式设计合适的索引...

    oracle数据库学习笔记

    - **实体完整性**: 主键的唯一性,防止同一张表中出现重复记录。 - **参照完整性**: 外键约束,确保引用的完整性,即主表中的每一项记录必须存在于从表中。 - **自定义完整性**: 通过定义约束条件(如 CHECK 约束)...

Global site tag (gtag.js) - Google Analytics