【Mysql】【子查询-left join改写】前端SQL调优

相关数据已经脱敏处理

-- 原SQL
SELECT *
  FROM (SELECT a.*,
               (SELECT sum(CASE
                             WHEN (b.confidence < c.THRESHOLD * d.THRESHOLD AND
                                  b.KEY_NAME = d.TYPE_NAME) THEN
                              1
                             ELSE
                              0
                           END)
                  FROM tableAAA_detail     b,
                       tableBBB        c,
                       tableBBB_detail d
                 WHERE c.TYPE_NAME = 'tableAAA'
                   AND c.ID = d.TYPE_ID
                   AND b.ANNO_ID = a.ANNO_ID
                   AND b.RECORD_ID = a.RECORD_ID
                   AND (a.ACTIVE_FLG <> 1 OR a.ACTIVE_FLG IS NULL)
                   AND (b.ACTIVE_FLG <> 1 OR b.ACTIVE_FLG IS NULL)
                   AND b.KEY_NAME = d.TYPE_NAME) AS checkFlg
          FROM tableAAA a
         WHERE (a.QA_DROP_FLG IS NULL OR a.QA_DROP_FLG <> 1)
         ORDER BY a.ACTIVE_FLG ASC,
                  CASE
                    WHEN checkFlg > 0 THEN
                     0
                    ELSE
                     1
                  END ASC) p ;


-- Join改写(不等价)
SELECT a.*,sum(CASE WHEN (b.confidence < c.THRESHOLD * d.THRESHOLD AND
                                  b.KEY_NAME = d.TYPE_NAME) THEN
                              1
                             ELSE
                              0
                           END) AS checkFlg
          FROM tableAAA a join tableAAA_detail b on ( b.ANNO_ID = a.ANNO_ID
                   AND b.RECORD_ID = a.RECORD_ID)
join tableBBB_detail d on (b.KEY_NAME = d.TYPE_NAME)
join tableBBB        c on (c.ID = d.TYPE_ID)
WHERE (a.QA_DROP_FLG IS NULL OR a.QA_DROP_FLG <> 1)
AND (a.ACTIVE_FLG <> 1 OR a.ACTIVE_FLG IS NULL)
AND (b.ACTIVE_FLG <> 1 OR b.ACTIVE_FLG IS NULL)
and c.TYPE_NAME = 'tableAAA' 
group by a.ANNO_ID, a.RECORD_ID
/*
ORDER BY a.ACTIVE_FLG ASC,
                  CASE
                    WHEN checkFlg > 0 THEN
                     0
                    ELSE
                     1
                  END ASC
*/


--left join 改写
SELECT a.*,b.checkFlg 
from tableAAA a left join (
SELECT    b.ANNO_ID,b.RECORD_ID,sum(CASE
             WHEN (b.confidence < c.THRESHOLD * d.THRESHOLD AND
                  b.KEY_NAME = d.TYPE_NAME) THEN
              1
             ELSE
              0
           END) AS checkFlg
  FROM tableAAA_detail     b,
       tableBBB        c,
       tableBBB_detail d
 WHERE c.TYPE_NAME = 'tableAAA'
   AND c.ID = d.TYPE_ID
   AND (b.ACTIVE_FLG <> 1 OR b.ACTIVE_FLG IS NULL)
   AND b.KEY_NAME = d.TYPE_NAME
group by b.ANNO_ID,b.RECORD_ID
) b
on (b.ANNO_ID = a.ANNO_ID AND b.RECORD_ID = a.RECORD_ID)
where (a.QA_DROP_FLG IS NULL OR a.QA_DROP_FLG <> 1)
ORDER BY a.ACTIVE_FLG ASC, checkFlg desc


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值