web-dev-qa-db-fra.com

Requête SQL relation un à plusieurs

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.

14
Rich

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)             ║
╚════╩══════╩════════════════════╝
15
John Woo

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.

1
GojiraDeMonstah

Au lieu de JOIN, utilisez LEFT OUTER JOIN. Je voudrais aussi changer votre clause WHERE à 

WHERE training.Id = 1

si c'est équivalent

1
Melanie
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
0
A4 Page

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
0
Jeff70227