2014-01-11 169 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'更好。 –

相關問題