SQL-запрос от одного до многих отношений

У меня есть таблица для сотрудников и другая таблица с Обучение. Учебная таблица содержит различные учебные классы, которые сотрудники завершены. У нас есть обязательная профессиональная подготовка по вопросам безопасности, поэтому каждый сотрудник должен пройти этот учебный класс. У меня возникли проблемы с запуском запроса, который вернет всех сотрудников, которые либо перешли на завершение обучения, либо нет.

Пример Таблица сотрудников

╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║  1 ║ Bob  ║
║  2 ║ Tom  ║
║  3 ║ John ║
╚════╩══════╩

Пример Таблица тренировок

╔════╦══════════════╦════════════════════╗
║ ID ║ DEPARTMENT_ID║       CLASS        ║
╠════╬══════════════╬════════════════════╣
║  1 ║           1  ║ Security Awareness ║
║  2 ║           1  ║ Workplace Safety   ║
║  3 ║           2  ║ Security Awareness ║
╚════╩══════════════╩════════════════════╝

Конечный результат

╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝

Запрос, который я использую,

SELECT employee.id, employee.name, training.class
FROM employee
JOIN training ON employee.id = training.department_id
WHERE training.class LIKE '%SECURITY%'
ORDER BY employee_id

Сотрудник, упустивший класс "Осознание безопасности", просто не появляется и проваливается через трещины.

Ответ 1

используйте LEFT JOIN и переместите условие фильтрации во время соединения таблицы (в частности, в предложении ON)

Еще одна проблема заключается в использовании одинарных кавычек: ' ' not ‘ ’

SELECT  employee.id, 
        employee.name, training.class
FROM    employee   
        LEFT JOIN training 
            ON employee.id = training.department_id AND
                training.class LIKE '%SECURITY%'
ORDER   BY employee.id

РЕЗУЛЬТАТ

╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝

Ответ 2

Вы выполняете внутреннее соединение, то, что вы хотите, - это левое внешнее соединение. Разница заключается в следующем: внутреннее соединение будет отображаться только тогда, когда в объединенной таблице есть совпадение. Левое внешнее соединение возвращает все результаты из первичной таблицы, есть ли результаты в объединенной таблице или нет.

Ответ 3

То, что вы ищете, называется Outer Join. В этом случае вам понадобится левое внешнее соединение:

SELECT employee.id, employee.name, training.class 
FROM employee LEFT OUTER JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%Security%'
ORDER BY employee_id

Ответ 4

Вместо JOIN используйте LEFT OUTER JOIN. Я также изменил бы предложение WHERE на

WHERE training.Id = 1

если этот эквивалент

Ответ 5

Select e.id, e.name, t.class from employee e left outer join training t on e.id = t.department_id where t.class like '%Security%' order by e.id