2013-05-03 12 views
5

Ho riscontrato un problema interessante oggi (o almeno così sembra a me) e ho pensato che sarebbe stato produttivo condividerlo.Unione di queste due tabelle specifiche

Ho due tabelle del database con il seguente costrutto:

Tabella 1: mod_class

class_id 
CSD2311 
CSD2314 
CSD12 

Tabella 2: m_classes_enrolled_in

student_id class_id 
5   CSD2311 
5   CSD2314 

Quindi la prima tabella ha tutti i possibili class_id e il secondo ha class_i d's e lo studente che è iscritto in quella classe. Vorrei creare un elenco di tutte le classi che lo studente è non iscritto a. Finora a sinistra-join sembrava davvero bello, ma sembra impossibile visualizzare in questo modo:

SELECT mod_enrolled_in.class_id 
FROM mod_enrolled_in 
WHERE student_id <> 5 
INNER JOIN mod_class 
ON mod_enrolled_in.class_id = mod_class.class_id 

Qualsiasi aiuto sarebbe molto apprezzato, -D

risposta

2

Si potrebbe farlo in diversi modi

1)

Select class_id from mod_class 
EXCEPT 
    Select class_id From m_classes_enrolled_in WHERE student_id = 5 

2)

Select class_id from mod_class 
Where class_id NOT IN 
     (Select class_id From m_classes_enrolled_in WHERE student_id = 5) 

3)

Select class_id from mod_class m 
LEFT JOIN 
    (Select class_id From m_classes_enrolled_in WHERE student_id = 5) cs 
    ON m.class_id = cs.class_id 
WHERE cs.class_id IS NULL 
+0

Abbastanza completa risposta. Grazie ha fatto il lavoro! –

1

Questo è quello che stai cercando.

SELECT mod_enrolled_in.class_id 
FROM mod_enrolled_in 
LEFT JOIN mod_class 
ON mod_enrolled_in.class_id = mod_class.class_id 
WHERE class_id != 5 
AND mod_class.class_id is NULL 
+0

ho provato lo stesso prima che non ha funzionato. Grazie per la risposta comunque. –

+0

Prova ora ..! Ho modificato il post. Spiacente, non ho letto l'intera domanda alla prima occasione. : P – Manu

1

Non vuoi LEFT JOINmod_class in modo da poter fare un anti-join?

SELECT mod_class.class_id 
FROM mod_class 
LEFT JOIN mod_enrolled_in ON (mod_class.class_id = mod_enrolled_in.class_id 
AND mod_enrolled_in.student_id = 5) 
WHERE mod_enrolled_in.class_id IS NULL 
1

Prova questa:

SELECT c.class_id 
FROM mod_class c 

LEFT OUTER JOIN mod_enrolled_in e 
ON e.class_id = c.class_id 
AND e.student_id = ? 

WHERE e.student_id IS NULL; 
1

Utilizzare questa: -

Select class_id from mod_class 
Where class_id NOT IN (Select class_id From m_classes_enrolled_in) 

Vedere questo SQL FIDDLE