NOT IN改为LEFT JOIN或NOT EXISTS的实现

在SQL中用NOT IN会影响性能,导致的主要原因就是索引无效,所以最好是将NOT IN改为其他方式实现。

没修改之前的NOT IN写法:

[sql]  view plain copy
  1. SELECT DISTINCT  
  2.     t2.a_id  
  3. FROM  
  4.     temp_b t2  
  5. WHERE  
  6.     t2.a_id NOT IN(  
  7.         SELECT DISTINCT  
  8.             t4.a_id  
  9.         FROM  
  10.             b AS t3,  
  11.             temp_b AS t4  
  12.         WHERE  
  13.             t4.a_id = t3.a_id  
  14.     )  
修改为LEFT JOIN写法:

[sql]  view plain copy
  1. SELECT DISTINCT  
  2.     t6.a_id  
  3. FROM  
  4.     (  
  5.         SELECT  
  6.             t2.a_id,  
  7.             t5.a_id AS tempId  
  8.         FROM  
  9.             temp_b t2  
  10.         LEFT JOIN(  
  11.             SELECT DISTINCT  
  12.                 t4.a_id  
  13.             FROM  
  14.                 b AS t3,  
  15.                 temp_b AS t4  
  16.             WHERE  
  17.                 t4.a_id = t3.a_id  
  18.         )AS t5 ON t2.a_id = t5.a_id  
  19.     )AS t6  
  20. WHERE  
  21.     t6.tempId IS NULL  
修改为NOT EXISTS写法:

[sql]  view plain copy
  1. SELECT DISTINCT  
  2.     t2.a_id  
  3. FROM  
  4.     temp_b t2  
  5. WHERE  
  6.     NOT EXISTS(  
  7.         SELECT  
  8.             1  
  9.         FROM  
  10.             (  
  11.                 SELECT DISTINCT  
  12.                     t4.a_id  
  13.                 FROM  
  14.                     b AS t3,  
  15.                     temp_b AS t4  
  16.                 WHERE  
  17.                     t4.a_id = t3.a_id  
  18.             )AS t5  
  19.         WHERE  
  20.             t5.a_id = t2.a_id  
  21.     )  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值