SQL 改写 max decode 联合应用

好久 没有写博客了, 主要是感觉 没有找到 有价值的东西 分享。  今天 恰巧遇到一个。

于是记录下来,   或许以后看看的。 废话不说 上SQL。


     select   distinct   A.pso_id,   c.value value1,
                     case when e.value='0' then 1 else 0 end value2,
                     f.value value3,
                     g.value value4,
                     h.value value5,
                     case when h.value like '%装维随销%' then 1 else 0 end value6,
                     case when i.value is not null and i.value <>'无'then 1 else 0 end value7,
                     j.value value8
                  from srv_prod_serv_order_xl_3 a  
                    left join srv_pso_property_xl_3  c on a.pso_id=c.pso_id and c.prop_spec_id='170266'
                    left join srv_pso_property_xl_3  e on a.pso_id=e.pso_id and e.prop_spec_id='160029'
                    left join srv_pso_property_xl_3  f on a.pso_id=f.pso_id and f.prop_spec_id='160079'
                    left join srv_pso_property_xl_3  g on a.pso_id=g.pso_id and g.prop_spec_id='160076'
                    left join srv_pso_property_xl_3  h on a.pso_id=h.pso_id and h.prop_spec_id='160077'
                    left join srv_pso_property_xl_3  i on a.pso_id=i.pso_id and i.prop_spec_id='170029'
                    left join srv_pso_property_xl_3  j on a.pso_id=j.pso_id and j.prop_spec_id='170265'
               感觉此SQL, srv_pso_property_xl_3  扫描多次,  效率肯定存在问题,另外还要 distinct         SQL 优化, SQL 等价改写肯定是要会的,


    哥想了srv_pso_property_xl_3 能否扫描一次, 另外  这个SQL 是在  a 表中 找到字段, 再到  另外的表 翻译成其他 意思,  这儿有点像标量子查询了, 但肯定不能改成标量子查询。  哥想到了 decode , case when 和decode , 但后来查询了发现   一个很多重复数据, 哥查询了 a 表中 pos_id 发现  选择性 正好是 1,  知道答案了, 关联了 多次,   于是 原来的用了 distinct   去重, 但正的 会去重吗?? 哥估摸着  悬,  因为字段太多了。


于是哥 想到了聚合函数,  正好把数据聚集起来。  

 select A.pso_id,  max(decode(c.prop_spec_id,'170266', value, null  ) ) value1,  
                     max(case when c.prop_spec_id='160029' and  value='0' then 1 else 0 end) value2,
                      max(decode(c.prop_spec_id,'160079', value, null  ) ) value3,
                     max(decode(c.prop_spec_id,'160076', value, null  ) ) value4,
                     max(decode(c.prop_spec_id,'160077', value, null  ) ) value5,
                     max(case when  c.prop_spec_id='160077' and   value like '%装维随销%' then 1 else 0 end) value6,
                     max(case when c.prop_spec_id='170029' and  value is not null  and  value <>'无'then 1 else 0 end) value7,
                     max( decode(c.prop_spec_id,'170265', value, null  ) ) value8
                  from srv_prod_serv_order_xl_3 a  
                    left join srv_pso_property_xl_3  c on a.pso_id=c.pso_id 
                     and c.prop_spec_id in('170266','160029','160079', '160076', '160077', '170029', '170265' )
                   group by  A.pso_id。 

查询 , 看执行计划, 比对执行计划, 核对数据。  符合要求。 改写结束, 另外 次语句还可以继续优化, 但这里 告一段落了.........


 谨以此纪念 奋斗的自我.... good day , good jop  , good luck  
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值