好久 没有写博客了, 主要是感觉 没有找到 有价值的东西 分享。 今天 恰巧遇到一个。
于是记录下来, 或许以后看看的。 废话不说 上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