从一个表中选择另一个表中不存在

时间:2014-01-11 19:25:16

标签: sql ms-access

我有一张桌子和人,我有第二张桌来记录这些人是否“缺席” 缺席表(缺席)具有AbsenceID,PersonID和AbsentDate 人员表具有PersonID,FirstName,LastName

我正在尝试创建一个SQL,它将从People表中获取所有值,除了当天缺席的那些值。因此,如果例如Joe在Absences表中列出并且AbsentDate是11/01/2014,我希望从生成的查询中排除他的名字。这是我到目前为止所做的,但它没有告诉我任何事情:

我在下面尝试过,但它会返回所有行:

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

我确信这是一件非常简单的事情。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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'之间寻找你的价值,这就是{ {1}}运算符。

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的{​​{1}}工作得非常好(假设适当的索引等)。

答案 2 :(得分:1)

首先,您应该提到您使用的是哪个数据库,此处的当前信息是建议的答案 您应该按照以下方式编写查询

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