2016-09-30 2 views
0

У меня есть запрос и стол. Запрос «EmployeeTraining» включает имя сотрудника и учебный курс, который они приняли, дату и срок действия. То, что я хочу вернуть LeftJoin, - это ВСЕ доступные учебные курсы и курсы, которые не хватает каждому сотруднику, поэтому в сущности любые нули.Слева Join не вернет нули?

Всего в разделе «Применимое обучение» имеется 5 записей. Некоторые сотрудники взяли только 4/5 курсов и имеют только 4 записи в записи «EmployeeTraining». Не следует ли присоединиться к объединению, вернуть 5-й предмет тренировки для этого конкретного сотрудника с нулями в «датэтах» и «истечении»?

образца Применимо обучение:

  • WHMIS
  • Первая помощь
  • CPR
  • Пропан
  • TDG

Образец EmployeeTraining

  • Сэм | WHMIS | 05/03/2011 | 05/03/2012
  • Сэм | Первая помощь | 06/09/2010 | 06/09/2011
  • Сэм | CPR | 05/03/2011 | 05/03/2012
  • Сэм | Пропан | 12/03/2015 | 12/03/2018

Желательные Результаты

  • Сэм | WHMIS | 05/03/2011 | 05/03/2012
  • Сэм | Первая помощь | 06/09/2010 | 06/09/2011
  • Сэм | CPR | 05/03/2011 | 05/03/2012
  • Сэм | Пропан | 12/03/2015 | 12/03/2018
  • Сэм | TDG | |

Это левое соединение, сгенерированное с помощью Design View on Access, но оно не возвращает никаких нулей.

SELECT ApplicableTraining.AppTraining, 
EmployeeTraining.Employee, 
EmployeeTraining.DateTaken, 
EmployeeTraining.Expiry 

FROM ApplicableTraining LEFT JOIN EmployeeTraining ON ApplicableTraining.AppTraining = EmployeeTraining.Training; 

Я загрузил мою базу данных здесь https://drive.google.com/open?id=0B7foIFlbSH78cFpJOHFsYkxiUlU

+0

Добавить таблицу данных таблицы и ожидаемый результат. – jarlh

+0

По-видимому, нет курсов без каких-либо сотрудников. – jarlh

+0

Некоторые сотрудники прошли 4/5 учебных курсов и имеют 4 записи в запросе. Не должен ли Left Join возвращать 5-й курс обучения с нулями в «DateTaken» и Expiry? – Macellaria

ответ

1

Вам необходимо сделать CROSS JOIN между таблицей: Сотрудник и таблица: ПрименимоТренировка после LEFT JOIN с представлением: EmployeeTraining.

CROSS JOIN, соедините все записи из таблицы A со столом B, независимо от связи между их таблицами.

Sample Applicable Training: 

WHMIS 
First Aid 
CPR 
Propane 
TDG 

Sample Employee 

SAM 

Result: 
SELECT ApplicableTraining.AppTraining, Table[Employee].Employee 
FROM ApplicableTraining 
CROSS JOIN Table[Employee] 

WHMIS|SAM 
First Aid|SAM 
CPR|SAM 
Propane|SAM 
TDG|SAM 

Desired Results 

SELECT Table[Employee].Employee, 
     ApplicableTraining.AppTraining, 
     EmployeeTraining.DateTaken, 
     EmployeeTraining.Expiry 
FROM ApplicableTraining 
CROSS JOIN Table[Employee] 
LEFT JOIN EmployeeTraining ON ApplicableTraining.AppTraining = EmployeeTraining.Training and EmployeeTraining.Employee = Table[Employee]."EmployeeID" 

Sam | WHMIS | 05/03/2011 |05/03/2012 
Sam | First AID | 06/09/2010 | 06/09/2011 
Sam | CPR | 05/03/2011 | 05/03/2012 
Sam | Propane | 12/03/2015| 12/03/2018 
Sam | TDG | | 
+0

Перекрестно присоединяется к внешнему соединению? Кажется, он не хочет распознавать перекрестное соединение. Кажется, что распознает внешнее соединение, но у меня все еще возникают проблемы с получением желаемых результатов. – Macellaria

+0

Я обновляю свой ответ. См. Больше: https://support.office.com/en-us/article/Join-tables-and-queries-3f5838bd-24a0-4832-9bc1-07061a1478f6#bmcross – Rit

2

Если запрос не возвращает аннулирует, то нет обнуляет

Вы можете проверить, добавив WHERE EmployeeTraining.Training IS NULL

+2

Я бы оставил это как комментарий, но да, я согласен с этим. –

+0

Я обновил некоторые примеры данных, я считаю, что здесь что-то не так. – Macellaria

0

вам не хватает где состояние. Попробуйте дать псевдонимы для таблиц.

SELECT at.AppTraining, 
     et.Employee, 
     et.DateTaken, 
     et.Expiry 
FROM ApplicableTraining at 
    LEFT JOIN EmployeeTraining et ON at.AppTraining = et.Training 
WHERE et.Training IS NULL 
0

Пробуйте проверку на работоспособность, используя другой экзистенциальный оператор, например.

SELECT ApplicableTraining.AppTraining 
    FROM ApplicableTraining a 
WHERE NOT EXISTS (SELECT * 
         FROM EmployeeTraining a 
        WHERE a.AppTraining = e.Training); 

Если это ничего не возвращает, то отсутствуют отсутствующие значения.

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