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

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

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

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

  • 相关阅读:
    TreeSelect组件:vmodel语法糖进行父子组件传值案例
    带 icon 的输入框:slot方式。slot="prefix"和slot="suffix"
    双向绑定vmodel与单向绑定vbind:value
    使用Set集合对List集合去重
    前端报错: error in ./src/assets/fonts/iconfont.svg?t=1523541245904,Module parse failed: Unexpected token (1:0),vue.config.js中引入chainWebpack后报错
    当主键不是id时,而是其他字段,那么该字段要加上@Id注解(除了表中指定主键,实体类中也要用@Id指定主键)
    java将文件转为base64字符串和将base64字符串转为文件
    父组件向子组件传递getList方法:provide/inject
    带卡片的input输入框
    C#中使用#if DEBUG
  • 原文地址:https://www.cnblogs.com/luxd/p/6382963.html
Copyright © 2020-2023  润新知