2014-01-11 4 views
3

У меня есть один стол с людьми, и у меня есть вторая таблица для записи, если эти люди «отсутствуют» Отсутствует таблица (отсутствие) имеет отсутствие абзаца, PersonID и AbsentDate В таблице People есть 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

Какая СУБД вы используете? – 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 для этой даты. SO, если Joe, например, отсутствует 11/01/2014 (И это в таблице Absences), он не должен находиться в результатах, возвращаемых – 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 IN' в соответствии с комментариями к производительности. Существует также метод NOT NOT EXISTS, который также лучше, чем 'NOT IN'. –

Смежные вопросы