2013-03-06 8 views
10

Mam stół dla pracowników i kolejną tabelę z Treningiem. Tabela szkoleń zawiera różne szkolenia, które ukończyli pracownicy . Mamy obowiązkowe szkolenie w zakresie podnoszenia świadomości bezpieczeństwa, więc każdy pracownik musi ukończyć tę klasę szkoleniową. Mam problem z uruchomieniem zapytania, które zwróci WSZYSTKICH pracowników "wymienionych na zakończenie szkolenia lub nie.Zapytanie SQL od jednego do wielu relacji

Przykład Pracownik stół

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

Przykład Szkolenie

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

docelowa spowodować

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

Kwerenda że używam jest

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 

Pracownik, który nie ma klasy "Świadomość bezpieczeństwa", po prostu się nie pojawia i przechodzi przez pęknięcia.

+1

Czy department_id równa employee.id? – Maciej

Odpowiedz

10

użycie LEFT JOIN i przenieść warunek filtrowania podczas łączenia tabeli (specjalnie w ON klauzuli)

Another dotyczy użycia pojedynczych cytatów: ' ' nie ‘ ’

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 

WYNIK

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

Bardzo fajnie, nie wiedziałem, że mogę filtrować w złączu. Pomoże to również w innych obszarach. – Rich

+0

Mam tutaj inne wyjaśnienie http://stackoverflow.com/a/15205900/491243 –

1

Wykonujesz sprzężenie wewnętrzne, a to, co chcesz, to lewe sprzężenie zewnętrzne. Różnica polega na tym, że wewnętrzne sprzężenie osiągnie tylko wyniki w połączonej tabeli. Lewe sprzężenie zewnętrzne zwróci wszystkie wyniki z tabeli podstawowej, niezależnie od tego, czy wyniki są połączone w tabeli, czy nie.

+0

Wcale nie .. Nie zadziała –

0

To, czego szukasz, to połączenie zewnętrzne. W takim przypadku potrzebne będzie lewe sprzężenie zewnętrzne:

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

Zamiast JOIN użyj LEFT OUTER JOIN. Chciałbym również zmienić swój klauzuli WHERE do

WHERE training.Id = 1 

jeśli to odpowiednik

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 
Powiązane problemy