2008-09-11 11 views
0

J'essaie de faire quelque chose que j'ai fait un million de fois et ça ne marche pas, quelqu'un peut-il me dire pourquoi?Trouver des emails manquants dans SQL Server

J'ai une table pour les personnes qui ont envoyé des curriculum vitae, et il a leur adresse e-mail ... il

Je veux savoir si l'une de ces personnes n'ont pas signé sur le site Web. La table aspnet_Membership a toutes les personnes qui sont inscrites sur le site web.

Il ya 9472 demandeurs d'emploi, avec des adresses e-mail uniques.

Cette requête produit 1793 résultats:

select j.email from jobseeker j 
join aspnet_Membership m on j.email = m.email 

Cela donne à penser qu'il devrait y avoir 7679 (9472-1793) e-mails de personnes qui ne sont pas inscrits sur le site Web. Puisque 1793 d'entre eux correspondaient, je m'attendrais à ce que le reste d'entre eux ne correspondent pas ... mais quand je fais la requête pour cela, je n'ai rien!

Pourquoi cette requête ne me donne rien ???

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

Je ne sais pas comment cela pourrait être ne fonctionne pas - il dit essentiellement « montrez-moi tous les e-mails qui sont dans la table, mais pas demandeur d'emploi dans le tableau aspnet_Membership ...

Répondre

3

Nous avons récemment rencontré un problème très similaire où la sous-requête renvoyait parfois des valeurs nulles. Ensuite, la traite dans la déclaration nulle d'une manière bizarre, je pense toujours correspondant à la valeur, donc si vous changez votre requête:

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

il peut fonctionner ....

2

Vous pourriez ont beaucoup de doublons là-bas, je ne vois pas l'erreur de requête du haut de ma tête, mais vous pourriez essayer d'écrire cette façon.

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

vous pouvez également jeter un GROUP BY ou DISTINCT là pour se débarrasser des doublons

0

Vous pouvez utiliser exists à la place de in comme ceci:

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

Vous devriez obtenir de meilleures performances et d'éviter le comportement « bizarre » (que je soupçonne est de faire avec les valeurs nULL/résultats) lors de l'utilisation in.

Questions connexes