2

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

我需要的是获取teacher_lm 中存在但teacher 中没有的电子邮件。

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

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

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

谢谢你。

4

2 回答 2

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 出于优化原因推荐的版本。

于 2012-08-15T17:52:17.927 回答
1

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

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

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

于 2012-08-15T17:58:45.787 回答