好久 沒有寫博客了, 主要是感覺 沒有找到 有價值的東西 分享。 今天 恰巧遇到一個。
於是記錄下來, 或許以後看看的。 廢話不說 上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