Поиск недостающих писем в SQL Server - PullRequest
0 голосов
/ 11 сентября 2008

Я пытаюсь сделать что-то, что делал миллион раз, и это не работает, кто-нибудь может сказать мне, почему?

У меня есть таблица для людей, которые отправили резюме, и там есть их адрес электронной почты ...

Я хочу узнать, не зарегистрировался ли кто-либо из этих людей на веб-сайте. В таблице 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 ...

Ответы [ 4 ]

3 голосов
/ 11 сентября 2008

Недавно у нас была очень похожая проблема, когда подзапрос иногда возвращал нулевые значения. Затем, оператор in обрабатывает нуль странным образом, я думаю, что всегда соответствует значение, поэтому, если вы измените свой запрос на:

select j.email 
from jobseeker j
where j.email not in (select email from aspnet_Membership
                      where email is not null)

это может сработать ....

2 голосов
/ 11 сентября 2008

Там может быть много дубликатов. Я не вижу ошибку запроса в моей голове, но вы можете попробовать написать ее так:

SELECT j.email
FROM jobseeker j
LEFT JOIN aspnet_Membership m ON m.email = j.email
WHERE m.email IS NULL

Вы также можете добавить туда GROUP BY или DISTINCT, чтобы избавиться от дубликатов.

1 голос
0 голосов
/ 12 сентября 2008

Вы можете использовать exists вместо in следующим образом:

Select J.Email
From Jobseeker j
Where not exists (Select * From aspnetMembership a where j.email = a.email)

При использовании in вы должны получить лучшую производительность и избегать «странного» поведения (которое, я подозреваю, связано с нулевыми значениями / результатами)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...