2012-08-15 32 views
2

我有两个表: teacher_lm和老师。 这些表格既包含“teacher_email”列查询获得记录在一个表中,但不在另一个

我需要的是获取teacher_lm中存在的电子邮件,但不包含在teacher中。

我有2种不同的方法来解决这个问题,但我不明白为什么其中一个没有给出任何结果,另一个返回很多行。

第一位:842行

SELECT DISTINCT lm.teacher_email 
FROM  teacher_lm as lm 
WHERE  NOT EXISTS (SELECT * FROM teacher as lt 
     WHERE lt.teacher_email = lm.teacher_email   
    ) 

第二个:没有结果

SELECT DISTINCT lm.teacher_email FROM 
teacher_lm AS lm 
WHERE lm.teacher_email NOT IN 
(SELECT lt.teacher_email FROM 
teacher AS lt) 

你能告诉我什么,我做错了什么,什么是做到这一点的最好方法是什么?

谢谢。

回答

6

“in”子查询中可能有一个NULL。

试试这个:

SELECT DISTINCT lm.teacher_email 
FROM teacher_lm AS lm 
WHERE lm.teacher_email NOT IN (SELECT coalesce(lt.teacher_email, '') 
           FROM teacher AS lt) 

顺便说一句,我认为第一个版本是推荐使用的MySQL优化的原因的版本。

+0

谢谢!你是对的:)现在它给了相同数量的结果。 IN子查询需要花费数年的时间才能完成,因此我会选择那个。再次感谢:) – Vika 2012-08-15 17:57:30

+0

@Vika。 。 。以防万一您使用另一个数据库,EXISTS比IN更好的特性是针对mysql的。可能在其他数据库中也可能不是这样,但其他数据库引擎可以优化IN并且不会更好。 – 2012-08-15 18:55:38

1

您的第一个查询正在处理整行的存在。

第二个查询可能会返回空值。我不相信NOT IN子句在空值的情况下工作良好。

戈登的答案通过用空字符串替换空值来纠正此问题。

相关问题