不等值标量子查询改写

    做优化 最怕 遇到标量子查询了,    看到SQL 中 有标量子查询,    执行计划都不用看, 直接 干掉 标量子查询。  我再做优 化过程中  一看到标量  肯定第一步 就搞掉标量。


大多数情况下 遇到的是 等值 修改, 基本上都改掉了,   这下好了, 遇到不等值 标量了。  这下怎么改??  


 废话不多说了 上SQL:

select om.order_state, om.finish_date,
                           id, om.order_state,
                              (select count(*)  from work_date wd
                                where wd.oc_date > to_char(om.CREATE_DATE, 'yyyymmdd')
                                  and wd.oc_date <=to_char( nvl(finish_date, sysdate) , 'yyyymmdd')
                                  and wd.work_date_flag = 1)  run_dur,
                           om.limit_date
                      from OM_ORDER OM 。


其实看到的  比这个 要难看的多, 我在SQL上面 做了 精简,      如果等值的, 那好 就先分组, 再left join  关联 。 也有 先关联再分组的    这下好了  不等值。    

哥想了一会   先想到的是   分析函数中  有个 可移动范围  算数据,  想想 应该不是,  因为这里的 范围不定, 根据每行的数据  变化而变化。 


哥又想到了  先关联  在关联 。      于是着手写 SQL:

 select   om.order_state, om.finish_date, om.id, om.order_state, run_dur,  om.limit_date
                      from  OM_ORDER OM  inner join (
                      select OM.rowid rid, count(*) run_dur  from work_date wd inner join  OM_ORDER OM  on 
                                  wd.oc_date > to_char(om.CREATE_DATE, 'yyyymmdd')
                                  and wd.oc_date <=to_char( nvl(finish_date, sysdate) , 'yyyymmdd')
                                  and wd.work_date_flag = 1
                           group by  OM.rowid
                      ) on  ( OM.rowid = rid);

这样   OM表扫描2次 ,   work_date   表扫描一次,   总比   标量中   OM表有多少条  扫描多少次  work_date   要好, 但是  实际 项目中 需要看两个表的体积。   哥这个算是改出来了吧,  小伙伴们 有没有更好的办法呢???


 good  day , good luck, good jop

 

----  再次修改  

select max(om.order_state) order_state,  max(finish_date) finish_date ,  max(id) id, max(om.order_state) order_state,  decode(count(*),1,0, count(*)) run_dur, max(limit_date) limit_date
                   from work_date wd  right join  OM_ORDER OM  on
                                  wd.oc_date > to_char(om.CREATE_DATE, 'yyyymmdd')
                                  and wd.oc_date <=to_char( nvl(finish_date, sysdate) , 'yyyymmdd')
                                  and wd.work_date_flag = 1
                           group by  OM.rowid order by id ;  也满足




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值