Oracle 去重查询
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 去重查询的更多相关文章
- oracle 多字段去重查询
oracle 多字段去重查询 CreationTime--2018年6月29日15点11分 Author:Marydon 1.情景展示 需要对表BASE_MRI_DEVICE的COMPNAME.F ...
- Oracle数据库,模糊查询、去重查询
分组去重查询,并执行某一个函数 :select 分组字段,聚合函数 from 表名 where 条件 group by分组字段 select 分组字段,聚合函数 from 表名 where 条件 g ...
- oracle去重等基础问题
--去重查询方法一:根据id select * from sxe where id in(select min(id) from sxe group by username) order by id ...
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- 【SQL】Oracle分页查询的三种方法
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...
- 关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)
关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其... 方法一:使用to_char的fm格式,即: to_char(round(data.amount,2),'FM9999 ...
- Oracle参数化查询
Oracle参数化查询默认是根据顺序绑定的 select * from table where name=:p1 and (select id from table2 where name=:p1); ...
- oracle去重
oracle去重 create table tmp_table3 as (SELECT seqno FROM (SELECT t.seqno,ROWID, ROW_NUMBER() OVER(PART ...
- mysql和oracle 分页查询(转)
最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...
随机推荐
- oracle systemtap tracing
https://github.com/LucaCanali?tab=repositories https://github.com/LucaCanali/Linux_tracing_scripts/t ...
- C/C++ 函数指针 总结
什么是函数指针 就像某一变量的地址可以存储在相应的指针变量中一样,指向函数的指针中保存着函数代码起始处的地址 函数指针的声明 当声明一个函数指针时,必须声明它指向的函数类型.要指定函数类型,就要指出函 ...
- golang 关键字以及简单用法说明
golang只有25个关键字 package: 定义包名, go中任何一个文件必须有一个package, 一般而言,package的定义和文件所属文件夹一致, 并且main函数所在文件的package ...
- [翻译] 学习iOS开发的建议:如何从菜鸟到专家
[文章原地址] http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-from-novice-to-expert/ 翻译有误之处请勿见笑, ...
- openssh-server
安装 apt-get install openssh-server 配置 sudo gedit /etc/ssh/sshd_config PermitRootLogin without-passwor ...
- 如何记录linux终端下的操作日志
如何记录linux终端下的操作日志 在linux终端下,为方便检查操作中可能出现的错误,以及避免屏幕滚屏的限制,我们可以把操作日志记录下来.常用的工具有 screen,script,以及tee等,通过 ...
- 卡方检验(Chi-square test/Chi-Square Goodness-of-Fit Test)
什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法.它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析.其根本思想就是在于比较理论频数和实际频数 ...
- 支持5G-WiFi的安卓设备搜索不到5G信号解决方法
安卓设备必须获得root权限,然后修改 /system/etc/wifi/nvram_net.txt 文件, 将ccode = CN 改为 ccode = ALL.保存并重启即可. 三星EK-GC11 ...
- Linked List Cycle leetcode II java (寻找链表环的入口)
题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...
- mybatis异常 :元素内容必须由格式正确的字符数据或标记组成。
今天同事写一个查询接口的时候,出错:元素内容必须由格式正确的字符数据或标记组成. 错误原因:mybatis查询的时候,需要用到运算符 小于号:< 和 大于号: >,在mybatis配置文 ...