J'ai une table pour les employés et une autre table avecFormation. La table de formation contient divers cours de formation complétés par les employés de Nous avons une formation obligatoire sur la sensibilisation à la sécurité, alors Chaque employé doit suivre ce cours. Je ne parviens pas à exécuter une requête qui renvoie tous les employés de la formation terminée ou non.
Exemple de table d'employés
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║ 1 ║ Bob ║
║ 2 ║ Tom ║
║ 3 ║ John ║
╚════╩══════╩
Exemple de table d'entraînement
╔════╦══════════════╦════════════════════╗
║ ID ║ DEPARTMENT_ID║ CLASS ║
╠════╬══════════════╬════════════════════╣
║ 1 ║ 1 ║ Security Awareness ║
║ 2 ║ 1 ║ Workplace Safety ║
║ 3 ║ 2 ║ Security Awareness ║
╚════╩══════════════╩════════════════════╝
Résultat visé
╔════╦══════╦════════════════════╗
║ ID ║ NAME ║ CLASS ║
╠════╬══════╬════════════════════╣
║ 1 ║ Bob ║ Security Awareness ║
║ 2 ║ Tom ║ Security Awareness ║
║ 3 ║ John ║ (null) ║
╚════╩══════╩════════════════════╝
La requête que j'utilise est
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
L'employé absent de la classe "Sensibilisation à la sécurité" n'apparaît pas et tombe dans les fissures.
utiliser LEFT JOIN
et déplacer la condition de filtrage lors de la jonction de la table (spécifiquement dans la clause ON
)
Une autre préoccupation est d'utiliser des guillemets simples: ' '
pas ‘ ’
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
RÉSULTAT
╔════╦══════╦════════════════════╗
║ ID ║ NAME ║ CLASS ║
╠════╬══════╬════════════════════╣
║ 1 ║ Bob ║ Security Awareness ║
║ 2 ║ Tom ║ Security Awareness ║
║ 3 ║ John ║ (null) ║
╚════╩══════╩════════════════════╝
Vous effectuez une jointure interne, vous voulez une jointure externe gauche. La différence est la suivante: une jointure interne aura pour résultat seulement - des résultats correspondant à la table jointe. Une jointure externe gauche renverra tous les résultats de la table primaire, qu'il y ait des résultats dans la table jointe ou non.
Au lieu de JOIN, utilisez LEFT OUTER JOIN. Je voudrais aussi changer votre clause WHERE à
WHERE training.Id = 1
si c'est équivalent
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
Ce que vous recherchez s'appelle une jointure externe. Dans ce cas, vous aurez besoin d'une jointure externe gauche:
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