Нужна помощь с нечетным запросом доступа

#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 привередлив в отношении нескольких объединений, поэтому может потребоваться заключить одно из объединений в круглые скобки.