SQL: Differenz zweier Mengen feststellen
Die Differenz zweier Datenmengen lässt sich durch die Verneinung eines Semi-Joins in einem Exists-Ausdruck ermitteln.
Soll z.B. festgestellt werden, welche Seminare der Mitarbeiter mit der ma_nr 7654 besucht hat, die der Mitarbeiter mit der ma_nr 7521 nicht besucht hat, ist folgende Abfrage möglich.
Allgemeine Lösung
Hinweis für Access-Anwender
Um die folgenden Abfragen selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein.
SELECT sem_nr, stufe FROM seminar AS s WHERE s.ma_nr = 7654 AND NOT EXISTS( SELECT 0 FROM seminar WHERE sem_nr = s.sem_nr AND stufe = s.stufe AND ma_nr = 7521 ) ORDER BY 1, 2
sem_nr | stufe |
---|---|
SALA101 | 3 |
SALA101 | 4 |
Ähnlich würde man vorgehen, wenn in Erfahrung zu bringen ist, welche Mitarbeiter Seminare besucht haben, die der Mitarbeiter mit der ma_nr 7521 nicht besucht hat.
Allgemeine Lösung
SELECT ma_nr, sem_nr, stufe FROM seminar AS s WHERE NOT EXISTS( SELECT 0 FROM seminar WHERE sem_nr = s.sem_nr AND stufe = s.stufe AND ma_nr = 7521 ) ORDER BY 1, 2, 3
ma_nr | sem_nr | stufe |
---|---|---|
7499 | SALA101 | 3 |
7654 | SALA101 | 3 |
7654 | SALA101 | 4 |
Eine weitere Variation ergibt sich, wenn man herausfinden will, welche Seminare Mitarbeiter 7654 besucht hat, die kein anderer Mitarbeiter besucht hat.
Allgemeine Lösung
SELECT sem_nr, stufe FROM seminar AS s WHERE NOT EXISTS( SELECT 0 FROM seminar WHERE sem_nr = s.sem_nr AND stufe = s.stufe AND ma_nr <> 7654 ) ORDER BY 1, 2
sem_nr | stufe |
---|---|
SALA101 | 4 |