mysql中的 update语句,包含not in 和select

需求:将365天内没有消费记录的用户等级设置为其他

 

最初的sql:

      UPDATE mpb_customer mc 
SET mc.level_code = '其他' 
WHERE
        mc.id NOT IN (
             SELECT msb.customer_id FROM mpb_sale_b2b msb WHERE msb.sale_value > 0 AND sale_date BETWEEN '2019-07-21' AND '2020-07-20')

 

执行后没有获得应有的效果

原因:SELECT语句的结果集中包含了null

修改:      

UPDATE mpb_customer mc 
SET mc.level_code = '其他' 
WHERE
        mc.id NOT EXISTS (
             SELECT msb.customer_id FROM mpb_sale_b2b msb WHERE msb.sale_value > 0 AND sale_date BETWEEN '2019-07-21' AND '2020-07-20' AND msb.customer_id IS NOT NULL )

执行顺利

 

新问题:执行效率极低,大概1000多条数据,update用了8秒

召唤百度: update语句中有not in, not in 后面又跟select语句的话,select语句每次都会重新执行(大概是这么描述,具体出处找不到了)

修改:

UPDATE mpb_customer mc 
SET mc.level_code = '其他' 
WHERE
        mc.id NOT IN (
        SELECT
            a.* 
        FROM
            ( SELECT msb.customer_id FROM mpb_sale_b2b msb WHERE msb.sale_value > 0 AND sale_date BETWEEN '2019-07-21' AND '2020-07-20' AND msb.customer_id IS NOT NULL ) a 
        )

结果: 执行时间变成0.2秒

 

原理我也不清楚,如果有大佬知道的话烦请指导一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值