Поиск недостающих писем в SQL Server
Вопрос
Я пытаюсь сделать то, что делал миллион раз, и это не работает. Кто-нибудь может сказать мне, почему?
У меня есть таблица для людей, приславших резюме, и в ней есть их адреса электронной почты...
Я хочу узнать, НЕ зарегистрировался ли кто-нибудь из этих людей на веб-сайте.В таблице aspnet_Membership указаны все люди, которые зарегистрированы на веб-сайте.
Всего 9472 соискателя работы имеют уникальные адреса электронной почты.
Этот запрос дает 1793 результата:
select j.email from jobseeker j
join aspnet_Membership m on j.email = m.email
Это говорит о том, что должно быть 7679 (9472-1793) электронных писем людей, не зарегистрированных на сайте.Поскольку 1793 из них СОВПАДАЛИ, я ожидаю, что остальные НЕ совпадают...но когда я делаю запрос для этого, я ничего не получаю!
Почему этот запрос мне ничего не дает???
select j.email
from jobseeker j
where j.email not in (select email from aspnet_Membership)
Я не знаю, как это может не работать - в основном там говорится: «Покажи мне все электронные письма, которые находятся В таблице соискателей, но НЕ В таблице aspnet_Membership...
Решение
Недавно у нас была очень похожая проблема: подзапрос иногда возвращал нулевые значения.Затем оператор in странным образом обрабатывает значение null, я думаю, что оно всегда соответствует значению, поэтому, если вы измените свой запрос на:
select j.email
from jobseeker j
where j.email not in (select email from aspnet_Membership
where email is not null)
может сработает....
Другие советы
У вас может быть много дубликатов.Я не сразу заметил ошибку запроса, но вы можете попробовать написать ее так:
SELECT j.email
FROM jobseeker j
LEFT JOIN aspnet_Membership m ON m.email = j.email
WHERE m.email IS NULL
Вы также можете добавить сюда GROUP BY или DISTINCT, чтобы избавиться от дубликатов.
Вы могли бы использовать exists
вместо in
так:
Select J.Email
From Jobseeker j
Where not exists (Select * From aspnetMembership a where j.email = a.email)
Вы должны повысить производительность и избегать «странного» поведения (которое, как я подозреваю, связано с нулевыми значениями/результатами) при использовании in
.