CodeGym /Kurse /SQL SELF /Typische Fehler bei der Verwendung von JOIN

Typische Fehler bei der Verwendung von JOIN

SQL SELF
Level 12 , Lektion 4
Verfügbar

Jetzt ist es Zeit, mal über das echte Leben zu reden. Über die Seite davon, die man nicht vermeiden kann: Fehler. Fehler zu finden, zu fixen und zu verstehen ist einfach ein Muss, wenn du mit Daten arbeitest. Lass uns anschauen, über welche Stolpersteine du bei JOIN in SQL so rennst – und wie du sie umgehst.

Fehler 1: Join-Bedingung vergessen – kartesisches Produkt entsteht

Der Klassiker: Du vergisst, die Join-Bedingung mit ON anzugeben. Dann bekommst du ein kartesisches Produkt, bei dem jede Zeile aus der ersten Tabelle mit jeder Zeile aus der zweiten kombiniert wird. Das Ergebnis: Ein riesiger Haufen Zeilen, die null Sinn machen und dich nur verwirren.

Hier ein Beispiel. Angenommen, wir haben folgende Tabellen:

Studenten (students):

student_id name
1 Otto
2 Anna

Kurse (courses):

course_id course_name
101 Mathematik
102 Geschichte

Jetzt schreiben wir eine Query und vergessen das ON:

SELECT *
FROM students
JOIN courses;

Ergebnis:

student_id name course_id course_name
1 Otto 101 Mathematik
1 Otto 102 Geschichte
2 Anna 101 Mathematik
2 Anna 102 Geschichte

Sieht nicht wirklich richtig aus, oder? Dieser Albtraum heißt kartesisches Produkt.

So fixst du das: Nutze ON, um zu sagen, wie die Daten in den Tabellen zusammengehören.

SELECT *
FROM students
JOIN courses
ON students.student_id = courses.course_id;

Und schon kommt das nächste Kapitel im Fehlerbuch ...

Schutz vor Dummheiten

Das ist so ein verbreitetes Problem, dass PostgreSQL verbietet, JOIN ohne ON und Bedingung zu benutzen.

Wenn du wirklich jede Zeile mit jeder kombinieren willst, kannst du den Syntax ohne JOIN nehmen:

SELECT *
FROM students, courses;

Noch ein dritter Fall – wann JOIN ohne ON funktioniert:

  • Mit NATURAL JOIN – nimmt automatisch gleichnamige Spalten.
  • Mit USING – du gibst die Spalten an, nach denen gejoint wird.
  • CROSS JOIN – immer ohne Bedingung, ist das gleiche wie ein kartesisches Produkt.

Fehler 2: Falsche Join-Bedingung

Manchmal gibst du eine Join-Bedingung an, aber die ist falsch. Zum Beispiel verbindest du Tabellen nicht über die Keys, sondern über irrelevante Daten.

Angenommen, wir wollen eine Liste von Studenten und Kursen, für die sie eingeschrieben sind, machen aber einen Fehler und joinen die Tabellen über nicht zusammenhängende Felder:

SELECT *
FROM students
JOIN courses
ON students.student_id = courses.course_id;

So eine Query gibt dir ein falsches Ergebnis, weil student_id und course_id komplett verschiedene Dinge sind.

So fixst du das: Check, dass du die richtigen Spalten zum Joinen benutzt. Ein korrekter Join könnte so aussehen (wenn du eine Tabelle enrollments hast, die Studenten mit Kursen verbindet):

SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Fehler 3: Doppelte Zeilen im Ergebnis

Wenn du mehrere JOINs in einer Query hast, kann das manchmal zu doppelten Zeilen führen. Das passiert, wenn es in den Join-Tabellen doppelte Einträge gibt oder du die Join-Bedingungen falsch gesetzt hast.

Angenommen, Student Otto ist zweimal für denselben Kurs in der Tabelle enrollments eingetragen.

Einträge in enrollments:

student_id course_id
1 101
1 101

Jetzt gibt die Query mit JOIN folgendes zurück:

SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Ergebnis:

name course_name
Otto Mathematik
Otto Mathematik

So fixst du das: Erstens, schau, dass du keine doppelten Daten in deinen Tabellen hast. Zweitens, wenn das Verhalten gewollt ist, entferne Duplikate mit DISTINCT:

SELECT DISTINCT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Fehler 4: Zeilenverlust bei INNER JOIN

INNER JOIN gibt dir nur die Zeilen zurück, die in beiden Tabellen passen. Wenn es in einer Tabelle keinen passenden Wert gibt, wird die Zeile rausgeschmissen. Du kannst Daten verlieren, wenn du den falschen Join-Typ wählst.

Angenommen, wir haben einen Studenten, der noch für keinen Kurs eingeschrieben ist:

Studenten (students):

student_id name
1 Otto
2 Anna
3 Dhany

Einträge (enrollments):

student_id course_id
1 101
2 102

Jetzt die Query mit INNER JOIN:

SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Ergebnis:

name course_name
Otto Mathematik
Anna Geschichte

Und wo ist Dhany? Wenn du auch Studenten ohne Kurse sehen willst, musst du LEFT JOIN benutzen:

SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id;

Fehler 5: Falscher Umgang mit NULL-Werten

Wenn es in einer Tabelle Zeilen mit leeren (NULL) Werten gibt, können die aus dem Ergebnis rausfliegen (zum Beispiel bei Filterbedingungen).

Beispiel: Du nutzt LEFT JOIN, fügst aber dann ein WHERE zum Filtern hinzu.

SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id
WHERE courses.course_name = 'Mathematik';

Jetzt werden Studenten ohne Kurse nicht mehr angezeigt, obwohl du LEFT JOIN benutzt hast.

So fixst du das: Wenn du Zeilen ohne Kurse auch sehen willst, ersetze WHERE durch ON oder füge eine zusätzliche Bedingung hinzu:

SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id
WHERE courses.course_name IS NULL OR courses.course_name = 'Mathematik';

Fehler 6: Verwirrung bei Join-Typen

Du bist dir nicht sicher, welchen Join-Typ du nehmen sollst. Zum Beispiel benutzt du RIGHT JOIN, obwohl du auch einfach LEFT JOIN nehmen könntest, wenn du die Reihenfolge der Tabellen tauschst.

So vermeidest du Verwirrung:

  • Nimm LEFT JOIN, wenn es geht. Das ist meistens am verständlichsten.
  • Tausche die Reihenfolge der Tabellen, dann brauchst du keinen RIGHT JOIN.
1
Umfrage/Quiz
Mehrfache JOINs, Level 12, Lektion 4
Nicht verfügbar
Mehrfache JOINs
Mehrfache JOINs
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION