zoukankan      html  css  js  c++  java
  • 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 查询总数

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

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

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

  • 相关阅读:
    [RxSwift]3.3、数据绑定(订阅)
    [RxSwift]3.2、函数式编程 -> 函数响应式编程
    [RxSwift]2、Hello RxSwift!:我的第一个 RxSwift 应用程序
    [RxSwift]1、为什么要使用 RxSwift ?
    [RxSwift]RxSwift: ReactiveX for Swift
    [Swift]UIViewController
    104. 二叉树的最大深度
    103. 二叉树的锯齿形层次遍历
    102. 二叉树的层序遍历
    98. 验证二叉搜索树
  • 原文地址:https://www.cnblogs.com/luxd/p/6382963.html
Copyright © 2011-2022 走看看