查询获得记录在一个表中,但不在另一个
问题描述:
我有两个表: 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)
你能告诉我什么,我做错了什么,什么是做到这一点的最好方法是什么?
谢谢。
答
“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优化的原因的版本。
答
您的第一个查询正在处理整行的存在。
第二个查询可能会返回空值。我不相信NOT IN子句在空值的情况下工作良好。
戈登的答案通过用空字符串替换空值来纠正此问题。
谢谢!你是对的:)现在它给了相同数量的结果。 IN子查询需要花费数年的时间才能完成,因此我会选择那个。再次感谢:) – Vika 2012-08-15 17:57:30
@Vika。 。 。以防万一您使用另一个数据库,EXISTS比IN更好的特性是针对mysql的。可能在其他数据库中也可能不是这样,但其他数据库引擎可以优化IN并且不会更好。 – 2012-08-15 18:55:38