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