2012-10-30 66 views
0

我运行此查询获得0结果时,我不应该

select * 
from PortalUser 
where ID not in (select distinct PortalUserID from LoginHistory where LoginDateTime > '10/1/2012') 

并获得0的结果。

如果我运行

select distinct PortalUserID 
from LoginHistory 
where LoginDateTime > '10/1/2012' 

我得到预期的结果集。比方说50个结果

如果我运行

select * 
from portalUser 

我得到200个结果。

这是为什么?

只是要清楚。 LoginHistory表的PortalUserID不必是唯一的,但是PortalUser..ID是唯一的字段。

运行此查询

select count(ID) 
from PortalUser 
GO 
select count(Distinct PortalUserID) 
from LoginHistory where LoginDateTime > '10/1/2012'' 

返回119个47行

+0

您的结果强烈建议PortalUser中列出的每个人都有LoginTimeTime> 10/1/2012。您可以通过执行'select select count(*)from PortalUser'并将它与'从LoginHistory中选择不同的PortalUserID进行比较,其中LoginDateTime> '10/1/2012' – StarPilot

+0

我知道一个事实,即我有没有登录的用户在过去的2个月里。这是一个开发环境,其中一个用户是一名2年前辞职的开发人员。他的上次登录日期是2011年初的某个时间 –

+1

尝试使用NOT EXISTS而不是NOT IN。无论如何,这是一个更好的模式,但是如果PortalUserID可以为空,它可能会抛弃结果。也停止使用不安全和不明确的日期时间格式。如果这被解释为1月10日而不是10月1日呢?使用YYYYMMDD仅限日期字符串文字。我怀疑它会解决这个具体问题,但这是一个更好的做法。 –

回答

0

您的查询只在您的子查询返回的PortalUserID列表中选择ID。 PortalUser中是否有记录没有从您的子查询返回的ID。

+0

是的,我们的PortalUser表有一个ID,看起来像这个PortalUser..ID = LoginHistory..LoginID –

相关问题