0Pricing
Coding Interview Prep · Lektion

Die WHERE-Falle bei OUTER JOINs

Warum das Filtern einer per OUTER JOIN verknüpften Spalte in WHERE diesen unbemerkt in einen INNER JOIN verwandelt

Die WHERE-Falle bei OUTER JOINs ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Die Falle, in die alle geraten

Das ist der häufigste Fehler bei Outer Joins, den Interviewer einbauen: „Zeigen Sie jeden Kunden und seine Bestellungen aus dem Jahr 2024, einschließlich der Kunden ohne Bestellungen aus dem Jahr 2024.“

Ein Bewerber schreibt einen LEFT JOIN und fügt anschließend in WHERE einen Datumsfilter hinzu. Dadurch verschwinden Kunden ohne Bestellungen aus dem Jahr 2024 unbemerkt. Der LEFT JOIN wird stillschweigend zu einem INNER JOIN. Zu verstehen, warum das passiert, ist ein Signal auf Senior-Niveau.

Die fehlerhafte Abfrage

Hier sehen Sie den Fehler. Die Abfrage wirkt plausibel: alle Kunden behalten, ihre Bestellungen verknüpfen und auf das Jahr 2024 filtern.

Doch Kunden ohne Bestellungen oder ohne Bestellungen aus dem Jahr 2024 verschwinden aus dem Ergebnis. Die Anforderung, sie einzubeziehen, wird damit verletzt.

-- BUG: drops customers with no 2024 order
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01';

Warum das fehlschlägt

Erinnern Sie sich an die Reihenfolge der Verarbeitung: Zuerst wird der JOIN ausgeführt. Dabei entstehen Zeilen, in denen nicht passende Kunden in jeder Spalte der Bestellung den Wert NULL haben. Danach wird WHERE ausgeführt.

Für einen nicht passenden Kunden ist o.order_date NULL. Daher ergibt o.order_date >= '2024-01-01' den Wert UNKNOWN und nicht true. WHERE behält nur Zeilen, deren Bedingung wahr ist. Deshalb werden die NULL-Zeilen herausgefiltert – genau die Zeilen, die der LEFT JOIN erhalten sollte.

NULL setzt den Filter außer Kraft

Jeder Vergleich mit NULL ergibt UNKNOWN: NULL >= '2024-01-01' ist UNKNOWN, NULL = 5 ist UNKNOWN und sogar NULL <> 5 ist UNKNOWN.

Da WHERE nur Zeilen durchlässt, deren Auswertung TRUE ergibt, wird jede erhaltene Zeile ohne Übereinstimmung verworfen. Der gesamte Zweck des Outer Joins wird durch eine einzige WHERE-Bedingung für eine Spalte der rechten Tabelle zunichtegemacht.

Die Lösung: Filter in ON verschieben

Verschieben Sie den Filter in die ON-Klausel. Dort wird er Teil der Übereinstimmungsbedingung und vor dem Erhalt der Zeilen angewendet. Dadurch bleiben nicht passende Kunden mit NULLs erhalten.

-- CORRECT: filter lives in ON
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.order_date >= '2024-01-01';
-- customers with no 2024 order: kept, NULL order

ON und WHERE in einem Satz

Die Regel, die Sie im Interview nennen sollten:

Für die beibehaltene (äußere) Tabelle gehören Bedingungen für die andere Tabelle in ON; Bedingungen für die beibehaltene Tabelle selbst gehören in WHERE.

  • ON legt fest, was als Übereinstimmung gilt, und wird während des JOINs ausgeführt.
  • WHERE filtert die fertigen Zeilen, wird danach ausgeführt und entfernt NULL-Zeilen.

Ergebnisse im direkten Vergleich

Dieselben Daten, zwei Positionen des Filters, unterschiedliche Ergebnisse. Nehmen Sie an, dass Carol keine Bestellung aus dem Jahr 2024 hat.

  • Filter in WHERE: Carol wird entfernt. Effektiv handelt es sich um einen INNER JOIN.
  • Filter in ON: Carol erscheint einmal mit NULL in den Spalten der Bestellung. Die Anforderung ist erfüllt.

Der Unterschied im Ergebnis ist der gesamte Kern dieser Falle.

-- ON version output
-- Alice | 50 | 2024-03-01
-- Bob   | 20 | 2024-05-02
-- Carol | NULL | NULL   <-- preserved

Wann WHERE tatsächlich richtig ist

Nicht jedes WHERE bei einem Outer Join ist ein Fehler. Das Filtern der beibehaltenen Tabelle ist korrekt, weil dabei keine NULLs aus dem JOIN eine Rolle spielen.

Der Anti-Join aus der vorherigen Lektion verwendet WHERE o.id IS NULL sogar absichtlich, um genau dieses Verhalten auszunutzen. Entscheidend ist, dass Sie erkennen, welcher Fall vorliegt.

-- Fine: filtering the preserved (left) table
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'US';

Die Erkennungsheuristik

Wenn Sie einen Outer Join prüfen, durchsuchen Sie die WHERE-Klausel nach Bedingungen für die nicht beibehaltene Tabelle, ausgenommen IS NULL-Prüfungen für Anti-Joins.

Wenn Sie o.someColumn = ... oder eine Bereichs- beziehungsweise Gleichheitsprüfung für die äußere Seite in WHERE sehen, sollten Sie diese Falle vermuten. Fragen Sie sich: „Wird mein LEFT JOIN dadurch zu einem INNER JOIN?“ Meistens ist das der Fall.

Mehrere Bedingungen

Sie können beide Positionen kombinieren. Übereinstimmungsbedingungen für die rechte Tabelle gehören in ON; ein echter Filter nach dem JOIN für die linke Tabelle gehört in WHERE. Beide lassen sich problemlos gemeinsam verwenden.

SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.amount > 100          -- match condition
WHERE c.signup_year = 2023;    -- preserved-table filter

Die Erklärung laut aussprechen

Schildern Sie im Interview den Mechanismus, nicht nur die Lösung:

„Der JOIN läuft zuerst und füllt die Spalten der nicht passenden rechten Zeilen mit NULL. Eine WHERE-Bedingung für diese Spalten ergibt bei den NULL-Zeilen UNKNOWN, und WHERE verwirft Zeilen, deren Ergebnis nicht TRUE ist. Dadurch wird der Outer Join zu einem Inner Join. Wenn Sie die Bedingung in ON setzen, bleibt sie eine Übereinstimmungsbedingung, und die nicht passenden Zeilen bleiben erhalten.“ Diese Erklärung kommt immer gut an.

Kurze Prüfung

Sie müssen alle Kunden und nur deren Bestellungen aus dem Jahr 2024 auflisten, wobei auch Kunden ohne solche Bestellungen erhalten bleiben.

Zusammenfassung

Das Filtern einer Spalte der nicht beibehaltenen Tabelle in WHERE verwandelt einen Outer Join stillschweigend in einen Inner Join, weil NULLs aus nicht passenden Zeilen die Bedingung nicht erfüllen (UNKNOWN) und WHERE sie verwirft.

  • Übereinstimmungsbedingungen für die äußere Tabelle gehören in ON.
  • Filter für die beibehaltene Tabelle gehören in WHERE.
  • IS NULL in WHERE ist der beabsichtigte Anti-Join und nicht die Falle.
  • Erklären Sie die Reihenfolge der Verarbeitung, um zu zeigen, dass Sie den Mechanismus verstehen.

Häufig gestellte Fragen

Ist die Lektion „Die WHERE-Falle bei OUTER JOINs“ kostenlos?

Ja — der vollständige Text von „Die WHERE-Falle bei OUTER JOINs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Die WHERE-Falle bei OUTER JOINs“?

Warum das Filtern einer per OUTER JOIN verknüpften Spalte in WHERE diesen unbemerkt in einen INNER JOIN verwandelt Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Coding Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Die WHERE-Falle bei OUTER JOINs“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. LEFT JOIN und das Beibehalten nicht zugeordneter Zeilen
  2. Die Semantik von RIGHT und FULL OUTER JOIN
  3. Zeilen ohne Treffer finden (Anti-Join)
  4. Die WHERE-Falle bei OUTER JOINs
← Zurück zu Coding Interview Prep