用分析函数优化标量子查询

原语句如下

SELECT ii.*,
       CASE
         WHEN (SELECT COUNT(1)
                 FROM ii
                WHERE ii.id > 0
                  AND ii.flag = 2
                  AND ii.i_code = ii.i_code
                  AND ii.c_id NOT IN
                      (SELECT c_id
                         FROM c
                        WHERE ig_name LIKE '%停用%')) > 1 THEN
          2
         ELSE
          1
       END AS mulinv
  FROM ii
 WHERE (ii.id > 0 AND itemdesc LIKE :1 AND ii.isphantom <> :2)
   AND ii.c_id = :3
 ORDER BY ii.i_code, ii.i_name, ii. d_id

经询问 c.c_id是主键,这样就可以改写为left join

SELECT *
  FROM (SELECT ii.*,
               CASE
                 /*用分析函数代替标量自联接*/
                 WHEN (SUM(CASE WHEN flag = 2 AND c.c_id IS NULL THEN 1 END) over(PARTITION BY ii.i_code)) > 1 THEN
                  2
                 ELSE
                  1
               END AS mulinv
          FROM ii
          /*因c.cid为主键,所以可改为left join而不必担心主查询数据会翻倍*/
          LEFT JOIN c ON (c.c_id = ii.c_id AND c.ig_name LIKE '%停用%')
         /*为了保证分析函数窗口内数据与原标量范围一致,这儿的过滤条件要保持一致*/
         WHERE ii.id > 0) 
 /*提取出原标量所需数据后再应用其它的过滤条件*/
 WHERE itemdesc LIKE :1
   AND ii.isphantom <> :2
   AND ii.c_id = :3
 ORDER BY ii.i_code, ii.i_name, ii. d_id;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值