Oracle 查询结果去重保留一项
首先因为需要查询很多字段,也就排除了使用distinct的可能性。
1.1 原始sql
select finalSql.* from (select '' SMS_CONTENT, '2' as 短信发出类型_批量发出, yqdz.yqdz_hz_mc 短信接收方姓名, case when wc.JTDH is not null then wc.JTDH when wc.XIAOLINGTONG is not null then wc.XIAOLINGTONG when wc.SJ is not null then wc.SJ end 短信接受方手机号, '' 业务对象ID, yqdz.org_id 区分码 from yongqidizhi yqdz left join kehuview wc on wc.Y_ID = yqdz.yqdz_kh_id left join ranqibiao rqb on rqb.RQB_YQDZ_ID = yqdz.yqdz_id where (wc.JTDH is not null or wc.XIAOLINGTONG is not null or wc.SJ is not null) and yqdz.yqdz_kh_lx = '2') finalSql where length(trim(finalSql.短信接受方手机号)) = 11
1.2 查询结果
很显然存在重复项
1.3 查询总数
2.1 修改sql
select finalSql.SMS_CONTENT, finalSql.短信发出类型_批量发出, finalSql.短信接收方姓名, finalSql.短信接受方手机号, finalSql.业务对象ID, finalSql.区分码, count(*) as 次数 from (select '' SMS_CONTENT, '2' as 短信发出类型_批量发出, yqdz.yqdz_hz_mc 短信接收方姓名, case when wc.JTDH is not null then wc.JTDH when wc.XIAOLINGTONG is not null then wc.XIAOLINGTONG when wc.SJ is not null then wc.SJ end 短信接受方手机号, '' 业务对象ID, yqdz.org_id 区分码 from yongqidizhi yqdz left join kehuview wc on wc.Y_ID = yqdz.yqdz_kh_id left join ranqibiao rqb on rqb.RQB_YQDZ_ID = yqdz.yqdz_id where (wc.JTDH is not null or wc.XIAOLINGTONG is not null or wc.SJ is not null) and yqdz.yqdz_kh_lx = '2') finalSql where length(trim(finalSql.短信接受方手机号)) = 11 group by finalSql.SMS_CONTENT, finalSql.短信发出类型_批量发出, finalSql.短信接收方姓名, finalSql.短信接受方手机号, finalSql.业务对象ID, finalSql.区分码 order by 次数 desc
2.2 查询结果:
我是根据手机号进行分组的,很显然,这里存在很多的垃圾数据,我们需要将这些相同的数据只保留一条
2.3 查询总的记录数
3.1 因为返回结果并不需要“count(*)” 这个字段,因此在最外层再加一层查询,改进sql如下
select finalSql2.SMS_CONTENT, finalSql2.短信发出类型_批量发出, finalSql2.短信接收方姓名, finalSql2.短信接受方手机号, finalSql2.业务对象ID, finalSql2.区分码 from (select finalSql.SMS_CONTENT, finalSql.短信发出类型_批量发出, finalSql.短信接收方姓名, finalSql.短信接受方手机号, finalSql.业务对象ID, finalSql.区分码, count(*) as 次数 from (select '' SMS_CONTENT, '2' as 短信发出类型_批量发出, yqdz.yqdz_hz_mc 短信接收方姓名, case when wc.JTDH is not null then wc.JTDH when wc.XIAOLINGTONG is not null then wc.XIAOLINGTONG when wc.SJ is not null then wc.SJ end 短信接受方手机号, '' 业务对象ID, yqdz.org_id 区分码 from yongqidizhi yqdz left join kehuview wc on wc.Y_ID = yqdz.yqdz_kh_id left join ranqibiao rqb on rqb.RQB_YQDZ_ID = yqdz.yqdz_id where (wc.JTDH is not null or wc.XIAOLINGTONG is not null or wc.SJ is not null) and yqdz.yqdz_kh_lx = '2') finalSql where length(trim(finalSql.短信接受方手机号)) = 11 group by finalSql.SMS_CONTENT, finalSql.短信发出类型_批量发出, finalSql.短信接收方姓名, finalSql.短信接受方手机号, finalSql.业务对象ID, finalSql.区分码 order by 次数 desc) finalsql2
3.2 查询结果
3.3 查询总数
可见总数与第二步一致,并未缺少数据。
总结,因水平问题,在此只考虑最终查询结果符合要求,并未考虑性能、耗时等其他因素,如有需要,后期再做打算。
如有问题,欢迎大家斧正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律