SQL: Differenz zweier Mengen feststellen

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



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



Zurück zur Übersicht