在SQL Server中查找丢失的电子邮件
时间:2020-03-05 18:51:42 来源:igfitidea点击:
我正在尝试做一百万次已经完成的事情,但是没有成功,有人可以告诉我为什么吗?
我有一张发给简历的人的桌子,上面有他们的电子邮件地址...
我想了解这些人是否尚未在网站上注册。 aspnet_Membership表包含所有在网站上注册的人员。
有9472个求职者,具有唯一的电子邮件地址。
该查询产生1793个结果:
select j.email from jobseeker j join aspnet_Membership m on j.email = m.email
这表明应该有7679(9472-1793)个人未在网站上注册的电子邮件。由于其中1793个DID匹配,我希望其余的都不会匹配...但是当我查询时,我什么也没有!
为什么这个查询没有给我任何东西?
select j.email from jobseeker j where j.email not in (select email from aspnet_Membership)
我不知道这怎么可能行不通,它基本上说"给我看所有在Jobseeker表中的电子邮件,但不在aspnet_Membership表中...
解决方案
回答
我们可能在那里有很多重复项。我没有看到查询错误的提示,但是我们可以尝试以这种方式编写它:
SELECT j.email FROM jobseeker j LEFT JOIN aspnet_Membership m ON m.email = j.email WHERE m.email IS NULL
我们也可以在其中扔GROUP BY或者DISTINCT来消除重复项。
回答
最近,我们遇到了一个非常类似的问题,其中子查询有时返回空值。然后,in语句以一种奇怪的方式对待null,我认为总是匹配该值,因此,如果将查询更改为:
select j.email from jobseeker j where j.email not in (select email from aspnet_Membership where email is not null)
它可能会工作...。
回答
我们可以这样使用exists
而不是in
:
Select J.Email From Jobseeker j Where not exists (Select * From aspnetMembership a where j.email = a.email)
使用in时,我们应该获得更好的性能,并避免"怪异"行为(我怀疑这与空值/结果有关)。
回答
另请参阅从一个表返回不在另一表中的所有行的五种方法