#sql #ms-access
#sql #ms-access
Вопрос:
У меня есть существующая база данных Access, которая содержит записи об обучении сотрудников. Если сотрудник прошел обучение или был запланирован для обучения, в таблице ссылок есть запись. Если нет, то записи нет. Я хочу запросить всех сотрудников, не обученных определенному предмету, но нет никаких записей.
База данных выглядит следующим образом:
Table: Trainings
TrainingID AutoNumber
Description Text
...
Table: EmployeeTrainings
EmployeeTrainingID AutoNumber
TrainingID Number
EmployeeID Number
ScheduledDate Date/Time
...
Table: Employees
EmployeeID Number
FullName Text
...
Я хочу получить результат, подобный следующему, со следующими полями для сотрудников, которые не прошли данный тренинг:
Тренинги.Описание, Сотрудники.Полное имя, EMployeeTrainings.Запланированная дата
Как я могу этого добиться? Мне нужно некоторое руководство.
Ответ №1:
Я думаю, это должно помочь вам… Однако, поскольку они не были бы обучены, мы не можем назначить для них дату обучения, поэтому я включил только два столбца…
select
t.Description,
emp.FullName,
et.ScheduledDate
from
trainings t
join employees emp
left join EmployeeTrainings et
on emp.EmployeeID = et.EmployeeID
AND et.TrainingID = t.TrainingID
where
t.TrainingID IN ( 1, 3 )
order by
t.Description,
emp.FullName
Это должно дать вам то, что вы хотите… при выполнении ЛЕВОГО соединения он возвращает все записи в левой части соединения с записями в правую таблицу. Если таких записей с правой стороны нет (следовательно, сотрудники, которые никогда не были запланированы), их значение запланированной даты будет равно NULL… Для тех, кто нашел правильное соответствие, их даты будут включены в результирующий набор. Не уверен в синтаксисе «Access» в предложении IN… но это ДОЛЖНО работать так же, как и в других движках SQL.
Комментарии:
1. Вы не видите способа сопоставить существующие scheduleddates и оставить остальные пустыми?
2. @MAW74656, смотрите пересмотренный ответ
3. Хорошо, я думаю, что понимаю это. Возможно ли сделать то же самое с несколькими тренингами? т.Е. Предоставить мне всех сотрудников, которые не прошли обучение на тренинге 1 или 3?
4. @MAW74656, опубликована другая редакция.
5.
IN
Синтаксис работает в Access так, как вы его показали. Кроме того, Access привередлив в отношении нескольких объединений, поэтому может потребоваться заключить одно из объединений в круглые скобки.