业务场景
需要查询某数据,由于需要三张表关联查询,查询结果如下:

原始SQL语句

SELECT D.ORDER_NUM AS "申请单号" ,D.CREATE_TIME ,D.EMP_NAME AS "申请人",(SELECT extractvalue(t1.row_data,'/root/row/FI13_wasteName')FROM dat_table_row t1WHERE d.document_id = t1.document_idAND t1.table_id     = 'dynamicRowsIdPTFLXX') AS "废料名称",(SELECT extractvalue(t1.row_data,'/root/row/FI13_units')FROM dat_table_row t1WHERE d.document_id = t1.document_idAND t1.table_id     = 'dynamicRowsIdPTFLXX') AS "单位",(SELECT extractvalue(t1.row_data,'/root/row/FI13_estimate')FROM dat_table_row t1WHERE d.document_id = t1.document_idAND t1.table_id     = 'dynamicRowsIdPTFLXX') AS "预估数量",(SELECT extractvalue(t1.row_data,'/root/row/FI13_stockRemoval')FROM dat_table_row t1WHERE d.document_id = t1.document_idAND t1.table_id     = 'dynamicRowsIdPTFLXX') AS "累计出库数量",(SELECT extractvalue(t1.row_data,'/root/row/FI13_receivingTime')FROM dat_table_row t1WHERE d.document_id = t1.document_idAND t1.table_id     = 'dynamicRowsIdCGYTX') AS "收购方收货时间",(SELECT extractvalue(t2.row_data,'/root/row/FI13_collectionTime')FROM dat_table_row t2WHERE d.document_id = t2.document_idAND t2.table_id     = 'dynamicRowsIdPTSJSKSJ') AS "实际收款时间"
FROM dat_document d,dat_table_row dtr
WHERE d.form_name       ='FI14'
AND d.document_id       =dtr.document_id
AND (D.DOCUMENT_STATUS != 'deleted'
OR D.DOCUMENT_STATUS   IS NULL )--AND TO_CHAR(d.create_time,'yyyy-MM-dd') BETWEEN '2020-01-01' AND '2021-03-26'
AND d.order_num = 'FI1420210708002' --FI1420210708002
ORDER BY d.CREATE_TIME DESC;

一、distinct去重

select distinct d.order_num as "申请单号" ,d.create_time ,d.emp_name as "申请人",(select extractvalue(t1.row_data,'/root/row/FI13_wasteName')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "废料名称",(select extractvalue(t1.row_data,'/root/row/FI13_units')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "单位",(select extractvalue(t1.row_data,'/root/row/FI13_estimate')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "预估数量",(select extractvalue(t1.row_data,'/root/row/FI13_stockRemoval')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "累计出库数量",(select extractvalue(t1.row_data,'/root/row/FI13_receivingTime')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdCGYTX') as "收购方收货时间",(select extractvalue(t2.row_data,'/root/row/FI13_collectionTime')from dat_table_row t2where d.document_id = t2.document_idand t2.table_id     = 'dynamicRowsIdPTSJSKSJ') as "实际收款时间"
from dat_document d,dat_table_row dtr
where d.form_name       ='FI14'
and d.document_id       =dtr.document_id
and (d.document_status != 'deleted'
or d.document_status   is null )--AND TO_CHAR(d.create_time,'yyyy-MM-dd') BETWEEN '2020-01-01' AND '2021-03-26'
and d.order_num = 'FI1420210708002' --FI1420210708002
order by d.create_time desc;

注意:DISTINCT后面要跟ORDER BY的字段,Oracle先执行 DISTINCT去重后,再使用ORDER BY进行排序的。所以如果在ORDER BY需要排序的字段,没有在 distinct 后的字段中,自然会抛错。
报错信息如下

二、row_number() over()

语法格式

select * from
(select A.*, row_number() over(partition by A.name1 order by A.name12 desc) rn from A)
where rn = 1
select * from (
select d.order_num as "申请单号" ,d.create_time ,d.emp_name as "申请人",(select extractvalue(t1.row_data,'/root/row/FI13_wasteName')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "废料名称",(select extractvalue(t1.row_data,'/root/row/FI13_units')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "单位",(select extractvalue(t1.row_data,'/root/row/FI13_estimate')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "预估数量",(select extractvalue(t1.row_data,'/root/row/FI13_stockRemoval')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdPTFLXX') as "累计出库数量",(select extractvalue(t1.row_data,'/root/row/FI13_receivingTime')from dat_table_row t1where d.document_id = t1.document_idand t1.table_id     = 'dynamicRowsIdCGYTX') as "收购方收货时间",(select extractvalue(t2.row_data,'/root/row/FI13_collectionTime')from dat_table_row t2where d.document_id = t2.document_idand t2.table_id     = 'dynamicRowsIdPTSJSKSJ') as "实际收款时间",row_number() over(partition by d.order_num  order by d.create_time desc) rn
from dat_document d,dat_table_row dtr
where d.form_name       ='FI14'
and d.document_id       =dtr.document_id
and (d.document_status != 'deleted'
or d.document_status   is null )--AND TO_CHAR(d.create_time,'yyyy-MM-dd') BETWEEN '2020-01-01' AND '2021-03-26'
and d.order_num = 'FI1420210708002' --FI1420210708002
) where rn = 1;

查询结果

参考文章
https://www.cnblogs.com/fina1ly/p/9509795.html
https://blog.csdn.net/deniro_li/article/details/79024099

Oracle实现去重的两种方式总结相关推荐

  1. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  2. r如何连接oracle,R语言 R两种方式连接Oracle

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 一.通过RODBC包连接oracle 1.首先在本机找到ODBC数据源,点击添加,按照自己的oracle,填写下面三个位置 2.填写完之后,点 ...

  3. oracle并行parallel update两张表_Oracle并行更新的两种方式(merge/update内联视图)

    对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍: 创建用例表: cr ...

  4. 有效创建Oracle dblink的两种方式

    有效创建Oracle dblink的两种方式 两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink. 其实dblink和数据库中的 ...

  5. oracle自增的两种办法,ORACLE数据库实现自增的两种方式

    Mysql数据库因为其有自动+1,故一般我们不需要花费太多时间,直接用关键字auto_increment即可,但是Oracle不行,它没有自动增长机制.顾我们需要自己去实现.一般有两种方式,但是这两种 ...

  6. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  7. Oracle创建Database Link的两种方式

    Oracle数据库如何创建Database Link呢?本文我们主要就介绍一下这部分内容,Oracle数据库创建Database Link有两种方式,一种是通过菜单,一种是通过SQL. 创建一个dbl ...

  8. Java连接Oracle两种方式thin与oci区别

    Java连接Oracle两种方式thin与oci区别 前几天同事跑过来跟我说, 机房中的一台tomcat服务器跟oracle数据库机连接很慢,查看控制台中的hibernate日志, 基本上是一条sql ...

  9. oracle 删除原有的数据,oracle数据库删除数据的两种方式

    当表中的数据不需要是,则应该删除该数据,并释放所占用的空间; 删除表中的数据有delete和truncate两种方式,下面分别介绍: 一.delete语句 (1)有条件删除 语法格式:delete [ ...

最新文章

  1. Netflix CEO哈斯廷斯:内容为王 公司潜力依然巨大
  2. php 获取signature,PHP开发微信无法获取到signature,timestamp,nonce
  3. Linux shell脚本编程(一)
  4. oracle分区交换有啥好处,分区交换的速度为什么快?
  5. ASP.NET vs MVC vs WebForms
  6. mysql流程控制_Mysql之流程控制结构
  7. 使用Swagger轻松记录您的Play Framework REST API
  8. Android应用程序结构解析
  9. 13. PHP 表数据入口(table data gateway)
  10. 记录平台调用支付中心接口
  11. MAC下Charles的破解版
  12. 中秋海报设计素材|中秋节海报文案
  13. Debian安装WPS的方法
  14. Scala教程-详细全部
  15. es修改排序_ElasticSearch自定义排序(转载)
  16. SSM整合-内涵基本SSM开发基本结构框架
  17. 【TK精灵】一款界面友好的桌面程序(exe)进程守护管理软件
  18. 再见了, 达叔!我用Python回顾一代喜剧大师203部作品,太经典了!
  19. 工作总结 2018-4-13 bootstrapTable 属性 queryParams: queryParams,//参数 get 中 %5B%5D 数组的意思...
  20. 使用starUML一步一步画顺序图

热门文章

  1. linux篇【4】:进程与操作系统
  2. 计算机毕业设计SSM大学生创新创业项目活动管理平台【附源码数据库】
  3. 2020二维码经济相关报告
  4. 嵌入式ARM汇编详解(持续更新)
  5. 基于java网上服装店设计与实现(mvc+jsp+servlet+jdbc+MySQL)
  6. Unity基础笔记(1)—— Unity基本操作与基本组件介绍
  7. atx和matx机箱_ATX还是mATX?
  8. 分组查询操作(MySQL)
  9. 四位BCD计数器verilog_verilog--计数器设计12-hour clock
  10. STM32CubeMX系列|红外遥控