Oracle 去重查询

CreateTime--2018年2月28日15:38:45

Author:Marydon

(一)使用distinct

--查询指定区间内表停诊字段的值
SELECT DISTINCT T.CLOSE_TZ
FROM CONSULT_SCHEDULE T
WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd') AND
TO_DATE('2018-02-28', 'yyyy-MM-dd');

说明:

  使用distinct关键字,后面跟一个字段,则只对该字段的值进行去重;

  后面跟2个字段,则表示column1+column2两个字段不完全一致进行去重。

(二)对指定字段去重后,再查出该行数据的其他字段信息

UpdateTime--2017年7月10日10:54:20

1.2.5 对某字段进行去重后,根据这个字段查出在表中所对应的记录

实例1: 查询指定医院对应科室下属的医生(需要去重)

查询结果字段:医生id,医生姓名,医疗机构id,科室id

  sql1:没有根据医生id进行去重,只查出了所需字段

--查询排班表中字段:医生ID,医生姓名,医疗机构ID,科室ID
SELECT T.DOCTOR_ID AS FDOCTORCODE,
T.DOCTOR_NAME AS FDOCTORNAME,
T.DOCTOR_PHONE AS FDOCTORPHONE,
T.ORG_ID AS FORGID,
T.DEPENT_ID AS FDEPTCODE
FROM CONSULT_SCHEDULE T
WHERE ORG_ID = ''
AND DEPENT_ID = ''

  查询结果:有很多重复记录

  sql2:根据医生id进行去重,没有查出所需字段

--实现效果:根据已知条件对医生id进行去重查询
--查询条件:医疗机构id和科室id
--对查询结果进行分组
--查询字段:rowid和计数
--查询结果:查出每组排班信息中取最大的rowid
SELECT MAX(ROWID),COUNT(1)
FROM CONSULT_SCHEDULE
WHERE ORG_ID = ''
AND DEPENT_ID = ''
GROUP BY DOCTOR_ID 

  查询结果: 按医生id进行分组后,取每组记录中最大的rowid

  sql3:完美实现

--根据条件(指定医疗机构,指定科室)对医生信息进行去重并查询出指定字段(医生id,医生名称,医生电话,机构id,科室id)
SELECT T.DOCTOR_ID AS FDOCTORCODE,
T.DOCTOR_NAME AS FDOCTORNAME,
T.DOCTOR_PHONE AS FDOCTORPHONE,
T.ORG_ID AS FORGID,
T.DEPENT_ID AS FDEPTCODE
FROM CONSULT_SCHEDULE T
WHERE T.ROWID IN (SELECT MAX(ROWID)
FROM CONSULT_SCHEDULE
WHERE ORG_ID = ''
AND DEPENT_ID = ''
GROUP BY DOCTOR_ID)

  sql4:完美实现

SELECT T.DOCTOR_ID    AS FDOCTORCODE,
T.DOCTOR_NAME AS FDOCTORNAME,
T.DOCTOR_PHONE AS FDOCTORPHONE,
T.ORG_ID AS FORGID,
T.DEPENT_ID AS FDEPTCODE
FROM CONSULT_SCHEDULE T,
(SELECT MAX(ROWID) ROWID2
FROM CONSULT_SCHEDULE
WHERE ORG_ID = ''
AND DEPENT_ID = ''
GROUP BY DOCTOR_ID) T2
WHERE T.ROWID = T2.ROWID2

  sql5:推荐使用

SELECT T.DOCTOR_ID AS FDOCTORCODE,
max(T.DOCTOR_NAME) AS FDOCTORNAME,
max(T.DOCTOR_PHONE) AS FDOCTORPHONE,
max(T.ORG_ID) AS FORGID,
max(T.DEPENT_ID) AS FDEPTCODE
FROM CONSULT_SCHEDULE T
WHERE ORG_ID = ''
AND DEPENT_ID = ''
GROUP BY DOCTOR_ID

  查询结果:

  错误实现方式一:

   使用distinct实现

--错误方式一
SELECT DISTINCT T.DOCTOR_ID AS FDOCTORCODE,
T.DOCTOR_NAME AS FDOCTORNAME,
T.DOCTOR_PHONE AS FDOCTORPHONE,
T.ORG_ID AS FORGID,
T.DEPENT_ID AS FDEPTCODE
FROM CONSULT_SCHEDULE T
WHERE T.ORG_ID = '416211338'
AND T.DEPENT_ID = '1004' 

  错误结果: 

    错在哪:

      distinct的用法是:

      a.distinct + 单个字段,表示对该字段进行去重处理;

      b.distinct + column1,column2,。。。,表示的是使用n个字段进行联合去重,即查出来的是这n个字段的值相加结果不一致的数据;

         而不是:对第一个字段做去重处理后,再将其他字段查询出来。

    错误实现方式二

--错误方式二
SELECT T.DOCTOR_ID AS FDOCTORCODE,
T.DOCTOR_NAME AS FDOCTORNAME,
T.DOCTOR_PHONE AS FDOCTORPHONE,
T.ORG_ID AS FORGID,
T.DEPENT_ID AS FDEPTCODE
FROM CONSULT_SCHEDULE T
WHERE T.DOCTOR_ID IN (SELECT DISTINCT T2.DOCTOR_ID
FROM CONSULT_SCHEDULE T2
WHERE T2.ORG_ID = ''
AND T2.DEPENT_ID = '')

    错误结果:

    错在哪:

      先用distinct虽然查出来的医生id具有唯一性,但是, 根据这个唯一的医生id结果集去查询其他字段数据的结果无法保证数据的唯一性

    实例2:查CONSULT_SCHEDULE表中字段:医生id,姓名,医疗机构id,科室id并根据医生id去重

      sql实现:

SELECT T.DOCTOR_ID    AS FDOCTORCODE,
T.DOCTOR_NAME AS FDOCTORNAME,
T.DOCTOR_PHONE AS FDOCTORPHONE,
T.ORG_ID AS FORGID,
T.DEPENT_ID AS FDEPTCODE
FROM CONSULT_SCHEDULE T,
(SELECT MAX(ROWID) ROWID2 FROM CONSULT_SCHEDULE GROUP BY DOCTOR_ID) T2
WHERE T.ROWID = T2.ROWID2 

      查询结果:

 

Oracle 去重查询的更多相关文章

  1. oracle 多字段去重查询

      oracle 多字段去重查询 CreationTime--2018年6月29日15点11分 Author:Marydon 1.情景展示 需要对表BASE_MRI_DEVICE的COMPNAME.F ...

  2. Oracle数据库,模糊查询、去重查询

    分组去重查询,并执行某一个函数 :select  分组字段,聚合函数 from 表名 where 条件 group by分组字段 select 分组字段,聚合函数 from 表名 where 条件 g ...

  3. oracle去重等基础问题

    --去重查询方法一:根据id select * from sxe where id in(select min(id) from sxe group by username) order by id ...

  4. Oracle层次查询

    Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...

  5. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  6. 关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)

    关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其... 方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999 ...

  7. Oracle参数化查询

    Oracle参数化查询默认是根据顺序绑定的 select * from table where name=:p1 and (select id from table2 where name=:p1); ...

  8. oracle去重

    oracle去重 create table tmp_table3 as (SELECT seqno FROM (SELECT t.seqno,ROWID, ROW_NUMBER() OVER(PART ...

  9. mysql和oracle 分页查询(转)

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

随机推荐

  1. 线程系列06,通过CLR代码查看线程池及其线程

    在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem ...

  2. SpringMVC和Springboot的区别(网摘)

    spring boot 我理解就是把 spring spring mvc spring data jpa 等等的一些常用的常用的基础框架组合起来,提供默认的配置,然后提供可插拔的设计,就是各种 sta ...

  3. mac 下 outlook 邮箱 服务器端口设置

  4. 在VS 2010上搭建Windows Phone 7开发平台

      如今Windows Phone 7平台越来越火了,刚刚拿到一款新的Windows Phone,于是准备在电脑上搭建WP7的开发环境. 首先,安装VS2010,升级到SP1,并安装Windows P ...

  5. dwz 刷新当前navtab

    List.jsp 其navtabId为TradingStrategy_31: <form method="post" action="${contextPath}/ ...

  6. JQuery实现可直接编辑的表格

    本文实例讲述了JQuery实现可直接编辑的表格.分享给大家供大家参考.具体分析如下: 功能: 创建一个表格,用户单击某个单元格后,可以直接修改单元格文本.在编辑状态下,用户可按回车键确认修改,按ESC ...

  7. Nodejs开发人脸识别系统-教你实现高大上的人工智能

    Nodejs开发人脸识别系统-教你实现高大上的人工智能   一.缘起缘生 前段时间有个H5很火,上传个头像就可以显示自己穿军装的样子,无意中看到了一篇帖子叫 全民刷军装背后的AI技术及简单实现 ,里面 ...

  8. mac下zsh的使用:主题、z命令

    安装Oh-My-ZSH: `curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh` zs ...

  9. [转载] java的书

    1. Java 语言基础 谈到Java 语言基础学习的书籍,大家肯定会推荐Bruce Eckel 的<Thinking in Java >.它是一本写的相当深刻的技术书籍,Java 语言基 ...

  10. 初识Tomcat

    Tomcat的安装非常简单,解压即可! Tomcat要正常运行,需要配置一个环境变量JAVA_HOME,指向jdk的主目录.