查询以获取存在于一个表中但不存在于另一个表中的记录

时间:2012-08-15 17:49:36

标签: mysql sql left-join exists

我有两张桌子: 老师和老师。 这些表都有“teacher_email”列

我需要的是获取teacher_lm中但不包含在教师中的电子邮件。

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

第一个: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)

你能告诉我这里我做错了什么,最好的办法是什么?

谢谢。

2 个答案:

答案 0 :(得分: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的版本。

答案 1 :(得分:1)

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

第二个查询可能返回空值。我不相信NOT IN子句在存在空值时效果很好。

Gordon的回答通过用空字符串替换空值来纠正这个问题。