现在有一张表A(字段id,tel)tel表示手机号码,有6万条记录。表B(字段id,login_name)login_name也表示手机号码,有10万条记录,表A中有部分号码在表B中,要求出表A不在B中的号码我的数据库是mysql
select a.tel
from z_a_member a 
where not in (select b.login_name from z_member b)这sql是我写的,不知道何时能出结果请教高手,有没有效率比较高的办法

解决方案 »

  1.   

    select a.tel
    from z_a_member a  
    where not exists (select b.login_name from z_member b where a.id = b.id)
    1.把not in改为not exists
    2.在B表的id上建立个索引
      

  2.   

    select a.tel from z_a_member a  
    where not exists(select 1 from z_member b where b.login_name =a.tel)
      

  3.   

    要你两个表的表结构差不多,你可以参考minus
    SQL中的MINUS关键字
      SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:
      [SQL Segment 1]
      MINUS
      [SQL Segment 2]
      其实简单的一句话就是找出第一条SQL查询的不在第二条SQL语句查询结果中的那些记录,并且要注意最后返回的结果集中,不同的记录只会被列出一次!
      下面是我做的实验,很明显能够看出MINUS的效率,made_order共23万笔记录,charge_detail共17万笔记录
     
    性能比较:
      SELECT order_id FROM made_order
      MINUS
      SELECT order_id FROM charge_detail
      1.14 sec
      
      SELECT a.order_id FROM made_order a
      WHERE NOT exists (
       SELECT 1
       FROM charge_detail
       WHERE order_id = a.order_id
       )
      18.19 sec
      
      SELECT order_id FROM made_order
      WHERE order_id NOT in (
       SELECT order_id
       FROM charge_detail
       )
      20.05 sec