SQL查询和优化(十四)——用分析函数优化标量子查询

当标量子查询中的表与主查询中的表一样,也就是自关联的时候,常常可以改为分析函数
SELECT a.*,
       CASE
         WHEN(SELECT COUNT(1)
               FROM ii b
               WHERE b.id > 0
               AND b.flag = 2
               AND b.i_code = a.i_code
               AND b.c_id NOT IN
                   (SELECT c_id
                      FROM c
                      WHERE ig_name LIKE '%停用%')) > 1
         THEN 2
         ELSE 1
       END AS mulinv
    FROM ii a 
    WHERE (a.id > 0 AND itemdesc LIKE : 1 AND a.isphantom <> : 2)
     AND a.c_id = :3
    ORDER BY a.i_code, a.i_name,a.d_id


主查询的过滤条件比标量多,所以要嵌套一次,再应用主查询中多出来的过滤条件
SELECT * 
  FROM(SELECT ii.*,
              CASE
              /*用分析函数代替标量自连接*/
               WHEN(SUM(CASE WHEN flag = 2 AND c.cid IS NULL THEN 1 END)over(PARTITION BY ii.i_code)) > 1 THEN 2
               ELSE 1
              END AS mulinv
            FROM ii
            LEFT JOIN c ON(c.c_id = ii.c_id AND ig_name LIKE '%停用%')
            WHERE ii.id > 0)
    WHERE itemdesc LIKE : 1 
     AND ii.isphantom <>:2
     AND ii.c_id = :3
    ORDER BY a.i_code, a.i_name,a.d_id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值