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  
















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章