LEFT JOIN und RIGHT JOIN Left und Right Joins helfen, in Tabellen, für die
1. keine referentielle Integrität definiert werden kann, die widersprüchlichen Datensätze (in den „Detailtabellen“) zu finden (= für einen
Sekundärschlüsselattributwert in der Detailtabelle findet sich kein Primärschlüsselwert in der Mastertabelle)
Beispiel:
Tabelle „Studentenstammdaten“ ist Mastertabelle mit Feld „MatrNr“ als Primärschlüssel.
Tabelle „Prüfungsleistungen“ ist Detailtabelle (MatrNr ist Sekundärschlüssel).
In der Tabelle „Prüfungsleistungen“ findet sich eine MatrNr, für die in der Tabelle „Studentenstammdaten“ kein Eintrag existiert. D.h., ein Student, der nicht immatrikuliert ist, hat eine Prüfungsleistung erbracht – oder der Student wurde fälschlicherweise aus der Liste der immatrikulierten Studenten
gestrichen usw.
Left bzw. Right Joins helfen somit, Dateninkonsistenzen (Fehler in der Datenbank) aufzudecken
und
2. in korrespondierenden Mastertabellen solche Datensätze zu finden, deren Primärschlüsselwerte in der Detailtabelle nicht als Sekundärschlüsselwerte
„auftauchen“.
Im o.g. Zusammenhang handelt es sich um Studenten, die zwar immatrikuliert sind, aber noch keine (oder nie?) eine Prüfung abgelegt haben. Oder es handelt sich um einen Erfassungsfehler, dass für den betr. Studenten bzw. die Studentin noch keine Prüfungsleistung vorliegt. Auch hier ist das Ziel, Fehler aufzudecken.
Gegeben seien folgende Tabellen:
Studentenstammdaten
MatrikelNr Nachname Vorname Namenszusatz Geburtsdatum PLZ Strasse Hausnummer
1 Maier Xaver 01.05.1982 85354 Unter der alten
Isarbrücke
99 2 Großkotz Waldemar 02.02.1980 80808 Menterschwaige 88 5 Neureich-
Müller Elfriede 01.02.1978 80809 Grünwald 1
7 Bond James 02.02.1971 85354 Am Wörth 1b
9 Rammelmaier Rambo 07.07.1982 81234 Am Schlagring 55 666666 Topman Ute Freifrau von
und zu 07.07.1983 99999 Am Schlachthof 1
Fächerstammdaten
FachID Bezeichnung 1000 Mathematik 1 1001 Statistik 1 1128 BWL 4435 VWL 4711 Physik 5540 Chemie 5640 Botanik 9978 Informatik 9999 Zoologie
Prüfungsleistungen
LfdNr Matrikelnummer Datum Fach_ID Note
1 7 09.06.2005 4711 1
2 7 09.06.2005 1128 4,3
3 7 09.06.2005 9978 2
4 7 09.06.2005 4435 2,3
5 7 09.06.2005 5540 1
6 9 09.06.2005 4711 2
7 9 09.06.2005 1128 3
8 9 09.06.2005 9978 1
9 9 09.06.2005 4535 2
10 9 09.06.2005 5640 1
11 5 09.06.2005 9978 2
12 5 09.06.2005 4435 1
13 1 09.06.2005 9978 3
14 1 09.06.2005 4435 2
15 2 09.06.2005 5540 4
Die „Probleme“ in den o.g. Tabellen sind:
1. Im Datensatz 9 der Prüfungsleistungen wurde eine Fach_ID erfasst, die in den Fächerstammdaten nicht existiert
2. Matrikelnummer 666666 (die Studentin Ute Topman) hat bisher noch keine Prüfungsleistung erbracht.
Das Problem Nr. 1 (Prüfungsleistung vorhanden, obwohl das Fach „gar nicht existiert“) kann mittels RIGHT JOIN wie folgt entdeckt werden:
SELECT Prüfungsleistungen.LfdNr, Prüfungsleistungen.Matrikelnummer, Prüfungsleistungen.Fach_ID, Fächerstammdaten.FachID
FROM Fächerstammdaten RIGHT JOIN Prüfungsleistungen ON Fächerstammdaten.FachID = Prüfungsleistungen.Fach_ID
WHERE (((Fächerstammdaten.FachID) Is Null));
Das Problem Nr. 1 (Prüfungsleistung vorhanden, obwohl das Fach „gar nicht existiert“) kann mittels LEFT JOIN wie folgt entdeckt werden:
SELECT Prüfungsleistungen.LfdNr, Prüfungsleistungen.Matrikelnummer, Prüfungsleistungen.Fach_ID, Fächerstammdaten.FachID
FROM Prüfungsleistungen LEFT JOIN Fächerstammdaten ON Prüfungsleistungen.Fach_ID = Fächerstammdaten.FachID WHERE (((Fächerstammdaten.FachID) Is Null));
Das Problem Nr. 2 (keine Prüfungsleistung vorhanden, obwohl Student immatrikuliert ist) kann mittels LEFT JOIN wie folgt entdeckt werden:
SELECT Prüfungsleistungen.LfdNr, Prüfungsleistungen.Matrikelnummer,
Studentenstammdaten.MatrikelNr, Studentenstammdaten.Nachname, Studentenstammdaten.Vorname
FROM Studentenstammdaten LEFT JOIN Prüfungsleistungen ON Studentenstammdaten.MatrikelNr =
Prüfungsleistungen.Matrikelnummer
WHERE (((Prüfungsleistungen.Matrikelnummer) Is Null));
Das Problem Nr. 2 (keine Prüfungsleistung vorhanden, obwohl Student immatrikuliert ist) kann jedoch auch mittels Right JOIN wie folgt entdeckt werden:
SELECT Prüfungsleistungen.LfdNr, Prüfungsleistungen.Matrikelnummer,
Studentenstammdaten.MatrikelNr, Studentenstammdaten.Nachname, Studentenstammdaten.Vorname
FROM Prüfungsleistungen RIGHT JOIN Studentenstammdaten ON Prüfungsleistungen.Matrikelnummer =
Studentenstammdaten.MatrikelNr
WHERE (((Prüfungsleistungen.Matrikelnummer) Is Null));