我有一张桌子和人,我有第二张桌来记录这些人是否“缺席” 缺席表(缺席)具有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)
我确信这是一件非常简单的事情。任何帮助将不胜感激
答案 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)