我有两张桌子: 老师和老师。 这些表都有“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)
你能告诉我这里我做错了什么,最好的办法是什么?
谢谢。
答案 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的回答通过用空字符串替换空值来纠正这个问题。