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

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

没修改之前的NOT IN写法:

  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写法:

  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写法:

  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.     )  

posted @ 2012-06-07 00:30  ansionchen  阅读(170)  评论(0)    收藏  举报