Запрос для получения записей, присутствующих в одной таблице, но НЕ в другой

У меня есть две таблицы: учитель_lm и учитель. В этих таблицах есть столбец "teacher_email"

Что мне нужно, так это получить электронные письма, которые присутствуют в Teacher_lm, ​​но не в учительском.

У меня есть 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)

Не могли бы вы сказать мне, что я делаю неправильно здесь, и как лучше всего это сделать?

Спасибо.


person Vika    schedule 15.08.2012    source источник


Ответы (2)


Подзапрос "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 из соображений оптимизации.

person Gordon Linoff    schedule 15.08.2012
comment
Спасибо!! Вы были правы :) Теперь это дало такое же количество результатов. Подзапрос IN занял на несколько лет больше времени, чем подзапрос EXIST, поэтому я выберу его. Спасибо еще раз :) - person Vika; 15.08.2012
comment
@Вика. . . на всякий случай, если вы когда-нибудь будете использовать другую базу данных, особенность EXISTS лучше, чем IN, специфична для mysql. Может быть, а может и не быть правдой в других базах данных, но другие механизмы баз данных лучше оптимизируют IN и NOT IN. - person Gordon Linoff; 15.08.2012

Ваш первый запрос работает с существованием целой строки.

Второй запрос может возвращать нули. Я не верю, что предложение NOT IN хорошо работает при наличии нулей.

Ответ Гордона исправляет это, заменяя нули пустой строкой.

person mcarpenter    schedule 15.08.2012