• 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 查询总数

    可见总数与第二步一致,并未缺少数据。

    总结,因水平问题,在此只考虑最终查询结果符合要求,并未考虑性能、耗时等其他因素,如有需要,后期再做打算。

    如有问题,欢迎大家斧正。

  • 相关阅读:
    用鼠标键盘来控制你的Android手机——同屏显示简单教程
    Ubuntu13.04 Eclipse下编译安装Hadoop插件及使用小例
    eclipse在Ubuntu 13.04下的安装过程及问题小记
    Ubuntu下安装qq方法及疑难问题解决
    POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)
    简单的字母全排列问题—递归法和STL法
    ichat在线客服jQuery插件(可能是历史上最灵活的)
    轻量级实用JQuery表单验证插件:validateForm5
    一句话在网页右上角加一个精致下拉框:forkme on github
    FastUI快速界面原型制作工具
  • 原文地址:https://www.cnblogs.com/luxd/p/6382963.html
Copyright © 2020-2023  润新知