需求:将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秒
原理我也不清楚,如果有大佬知道的话烦请指导一下