Trouver les e-mails manquants dans SQL Server
Question
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 ?
J'ai un tableau pour les personnes qui ont envoyé des CV, et il contient leur adresse e-mail...
Je veux savoir si l'une de ces personnes ne s'est PAS inscrite sur le site Web.La table aspnet_Membership contient toutes les personnes SONT inscrites sur le site Web.
Il y a 9472 demandeurs d'emploi, avec des adresses e-mail uniques.
Cette requête produit 1 793 résultats :
select j.email from jobseeker j
join aspnet_Membership m on j.email = m.email
Cela suggère qu'il devrait y avoir 7 679 (9 472-1 793) e-mails de personnes qui ne sont pas inscrites sur le site Web.Puisque 1793 d'entre eux correspondent, je m'attendrais à ce que le reste ne corresponde PAS...mais quand je fais la requête pour ça, je n'obtiens 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 ne pas fonctionner - cela dit essentiellement "montrez-moi tous les e-mails qui se trouvent DANS la table des demandeurs d'emploi, mais PAS DANS la table aspnet_Membership...
La solution
Nous avons récemment eu un problème très similaire où la sous-requête renvoyait parfois des valeurs nulles.Ensuite, l'instruction in traite null d'une manière étrange, je pense qu'elle correspond toujours à la valeur, donc si vous modifiez votre requête en :
select j.email
from jobseeker j
where j.email not in (select email from aspnet_Membership
where email is not null)
ça peut marcher....
Autres conseils
Vous pourriez avoir beaucoup de doublons.Je ne vois pas l'erreur de requête par tête, mais vous pouvez essayer de l'écrire de 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 y ajouter un GROUP BY ou DISTINCT pour vous débarrasser des doublons.
Vous pourriez utiliser exists
au lieu de in
comme ça:
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 éviter le comportement « bizarre » (qui, je suppose, est lié aux valeurs/résultats nuls) lors de l'utilisation in
.