2014-01-11 47 views
3

我有一个表格与人员,并且我有第二个表格来记录这些人员是否为“缺席” 缺席表格(缺席)具有缺席ID,PersonID和AbsentDate People Table有PersonID,名字,姓氏从另一个表格中选择不存在于另一个表格

我正在尝试制作一个SQL,它将从People表中获取所有值,但那些当天没有的表除外。因此,如果例如Joe列在Absences表中并且AbsentDate是11/01/2014,我希望他的名字不包含在生成的查询中。这是我到目前为止,但它表明我什么:

我已经试过以下,但它返回所有行:

SELECT * FROM People 
where not exists(Select PersonID 
       from Absences 
       where Absences.AbsentDate = 11/01/2014) 

我敢肯定,这是很简单的东西,我很想念。任何帮助,将不胜感激

+0

您使用什么DBMS? – Kermit

+0

我正在使用Microsoft Access – SSS

+0

“AbsentDate”列的数据类型是什么? –

回答

7
SELECT * FROM People 
where PersonID NOT IN (Select PersonID 
         from Absences 
         where DateValue(Absences.AbsentDate) = '20140111') 
                   ^YYYYMMDD 
+0

当我测试它时,仍然返回People表中的所有行 – SSS

+0

@SSS您是否试图返回在该特定日期缺席的人员姓名?或者谁不在? –

+0

Nono,Im试图从People表中获取所有值,除非它们在该日期的Absences表中被列为缺席。 因此,如果乔,例如是缺席11/01/2014(这是在缺席表),他不应该在结果返回 – SSS

1

首先你必须提到您正在使用的数据库,在这里当前信息建议答案 你应该写查询如下

SELECT * FROM People where PersonID NOT in (Select PersonID 
        from Absences 
        where Absences.AbsentDate = sysdate) 
2

由于AbsentDate是一个日期/时间字段,它存储日期和时间,并且您正在寻找两者的平等。因此'11/01/2014'相当于搜索'11/01/2014 00:00:00.000',我几乎可以打赌没有任何东西被存储。因此,更好的方法是在 '11/01/2014 00:00:00.0000'和'11/01/2014 23:59:59.999'之间查找您的值,这是BETWEEN运营商所做的。

SELECT * 
FROM People 
LEFT JOIN Absences ON (People.PersonID = Absences.PersonID) AND (Absences.AbsentDate BETWEEN '11/01/2014' AND '12/01/2014') 
WHERE AbsenceID IS NULL 

我不是NOT IN查询粉丝,因为他们可以在一般的非高性能。但LEFT JOIN其中加入表的主键是NULL工作相当不错(假设适当的索引等)

+1

我赞同这种方法,而不是根据性能评论意见。还有'NOT EXISTS'方法也比'NOT IN'更好。 –

相关问题