2013-03-06 24 views
10

Ho una tabella per i dipendenti e un'altra tabella con Formazione. La tabella di allenamento contiene vari corsi di formazione completati dai dipendenti di . Abbiamo un addestramento obbligatorio sulla consapevolezza della sicurezza, quindi ogni dipendente deve completare questo corso di formazione. Sto riscontrando problemi nell'esecuzione di una query che restituirà TUTTI i dipendenti elencati come completanti la formazione o meno. risultatoInterrogazione SQL uno a molti

Esempio dipendenti tavolo

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

Esempio Formazione

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

target

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

La query che sto usando è

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 

Il dipendente che manca la lezione "Awareness Security" non appare e cade attraverso le fessure.

+1

È department_id pari a employee.id? – Maciej

risposta

10

uso LEFT JOIN e spostare la condizione di filtraggio durante l'unione della tavola (precisamente nel ON clausola di)

altro preoccupazione è utilizzare le singole virgolette: ' ' non ‘ ’

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 

RISULTATO

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

Molto bello, non sapevo che avrei potuto filtrare all'interno del join. Questo aiuterà anche in altre aree. – Rich

+0

ho qui un'altra spiegazione http://stackoverflow.com/a/15205900/491243 –

1

Si sta eseguendo un join interno, quello che si desidera è un join esterno sinistro. La differenza è: un join interno sarà solo risultati dove c'è una corrispondenza nella tabella unita. Un join esterno sinistro restituirà tutti i risultati dalla tabella primaria, indipendentemente dal fatto che vi siano risultati nella tabella unita o meno.

+0

Niente affatto ... Non funzionerà –

0

Quello che stai cercando è chiamato Outer Join. In questo caso è necessario un join esterno sinistro:

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

Invece di JOIN utilizzare LEFT OUTER JOIN. Mi piacerebbe anche cambiare la tua clausola WHERE per

WHERE training.Id = 1 

se questo è equivalente

0
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 
Problemi correlati