Encontrando emails perdidos no SQL Server
Pergunta
Estou tentando fazer algo que já fiz um milhão de vezes e não está funcionando, alguém pode me dizer por quê?
Eu tenho uma tabela para pessoas que enviaram currículos e contém seus endereços de e-mail ...
Quero saber se alguma dessas pessoas NÃO se inscreveu no site.A tabela aspnet_Membership contém todas as pessoas que ESTÃO inscritas no site.
Existem 9.472 candidatos a emprego, com endereços de e-mail exclusivos.
Esta consulta produz 1793 resultados:
select j.email from jobseeker j
join aspnet_Membership m on j.email = m.email
Isso sugere que deveria haver 7.679 (9472-1793) e-mails de pessoas que não estão cadastradas no site.Já que 1793 deles corresponderam, eu esperaria que o resto NÃO correspondesse...mas quando faço a consulta para isso, não recebo nada!
Por que essa consulta não está me dando nada???
select j.email
from jobseeker j
where j.email not in (select email from aspnet_Membership)
Não sei como isso pode não estar funcionando - basicamente diz "mostre-me todos os e-mails que estão NA tabela de candidatos a emprego, mas NÃO NA tabela aspnet_Membership...
Solução
Tivemos um problema muito semelhante recentemente, em que a subconsulta às vezes retornava valores nulos.Então, a instrução in trata null de uma maneira estranha, acho que sempre corresponde ao valor, então se você alterar sua consulta para:
select j.email
from jobseeker j
where j.email not in (select email from aspnet_Membership
where email is not null)
pode funcionar....
Outras dicas
Você pode ter muitas duplicatas por aí.Não estou vendo o erro de consulta na minha cabeça, mas você pode tentar escrevê-lo desta forma:
SELECT j.email
FROM jobseeker j
LEFT JOIN aspnet_Membership m ON m.email = j.email
WHERE m.email IS NULL
Você também pode colocar um GROUP BY ou DISTINCT lá para se livrar das duplicatas.
Você poderia usar exists
em vez de in
assim:
Select J.Email
From Jobseeker j
Where not exists (Select * From aspnetMembership a where j.email = a.email)
Você deve obter melhor desempenho e evitar o comportamento 'estranho' (que suspeito ter a ver com valores/resultados nulos) ao usar in
.