我有两个表:员工表: EID,Name,Age ...
工资表: EID,Month,Salary ...每个月发工资后 都会相应在 工资表中插入一条记录,用于记录当月的工资信息现在我想找到在工资表中没有工资信息记录的所有员工, 请问这个查询语句要怎么写? 例如:11月份还没发工资的员工
select * from 员工表 where EID not in (select EID from 工资表 where month=11)但是执行的效率非常慢,半小时还没出结果, 请问有更好的办法吗?

解决方案 »

  1.   

    -- JUST TRY IT ..
    SELECT *
      FROM 员工表 T1
     WHERE NOT EXISTS (SELECT 1
              FROM 工资表 T2
             WHERE T1.EID = T2.EID
               AND T2.MONTH = 11);
      

  2.   

    select * from 员工表 t1 where not exists 
                              (select 1 from 工资表 t2 where month=11 and t1.eid=t2.eid) 语句就只能改成这样了...再考虑考虑索引方面的问题...
      

  3.   

    试试下面的这2个:select * from 员工表 where EID not in (select EID from 工资表 where month=11 and eid is not null) select *
      from 员工表 A, 工资表 B
     where A.eid = b.eid(+)
       and B.month = 11
       and B.eid is null
      
      

  4.   


    --first way:
    SELECT *
      FROM 员工表 T1
     WHERE NOT EXISTS (SELECT 1
              FROM 工资表 T2
             WHERE T1.EID = T2.EID
               AND T2.MONTH = 11);
    --second way:
    SELECT EID
      FROM 员工表 T1
     minus(SELECT EID
              FROM 工资表 T2
             WHERE T2.MONTH = 11);
      

  5.   

    上面第二种写法中,minus后面那个括号去掉
      

  6.   

    呵呵,學習
    如果數據量小的話,exist影響不太