0Pricing
SQL Interview Prep · Lektion

Zeilen innerhalb einer Tabelle vergleichen

SELF-JOIN-Muster zum Finden von Paaren, Duplikaten und benachbarten Datensätzen

Zeilen innerhalb einer Tabelle vergleichen ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 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 SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Self-Joins zum Vergleichen von Zeilen

Neben Hierarchien ist der andere große Anwendungsfall eines Self-Joins der Vergleich von Zeilen derselben Tabelle miteinander. Statt übergeordnete und untergeordnete Elemente zu verknüpfen, paaren Sie beliebige Zeilen, um Duplikate, nahezu identische Datensätze oder benachbarte Datensätze zu finden.

Das Muster ist dasselbe: Sie versehen die Tabelle mit zwei Aliasen und schreiben eine ON-Bedingung, die die Beziehung zwischen den beiden Zeilen beschreibt, die Sie paaren möchten.

Paare in derselben Gruppe finden

Eine klassische Frage: Finden Sie alle Mitarbeiterpaare, die in derselben Abteilung arbeiten. Verknüpfen Sie die Tabelle mit sich selbst über die gleiche Abteilung, halten Sie die beiden Zeilen aber voneinander getrennt.

Der naive Join würde außerdem jeden Mitarbeiter mit sich selbst paaren und jedes Paar zweimal erzeugen. Das beheben wir im nächsten Schritt.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;

Selbstpaare und gespiegelte Duplikate entfernen

Beim Bilden von Paaren derselben Gruppe gibt es zwei Probleme: Eine Zeile passt zu sich selbst (Alice mit Alice), und jedes Paar erscheint zweimal (Alice–Bob und Bob–Alice).

Beheben Sie beides mit einer einzigen Ungleichung: a.id < b.id. Damit ist garantiert, dass die beiden Zeilen verschieden sind, und außerdem bleibt nur eine Reihenfolge jedes Paars erhalten.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.id < b.id;

Warum a.id < b.id statt a.id <> b.id

Die Verwendung von a.id <> b.id entfernt Selbstpaare, liefert aber weiterhin beide Reihenfolgen und verdoppelt dadurch das Ergebnis. Die Verwendung von a.id < b.id entfernt Selbstpaare und beseitigt in einem Schritt das Spiegeldoppel.

Interviewer achten besonders auf die Wahl zwischen < und <>; daran erkennen sie, ob Sie die Kombinatorik von Self-Joins verstehen.

-- <>  keeps Alice-Bob AND Bob-Alice (duplicated)
-- <   keeps only Alice-Bob (correct unique pairs)

Doppelte Zeilen finden

Um Datensätze zu finden, die sich bei Schlüsselspalten duplizieren, führen Sie auf diesen Spalten einen Self-Join durch und verlangen unterschiedliche Primärschlüssel.

Hier finden wir Kunden, die dieselbe E-Mail-Adresse verwenden. a.id < b.id sorgt dafür, dass jedes Duplikatpaar einmal vorkommt. Oft ist ein GROUP BY ... HAVING COUNT(*) > 1 übersichtlicher, aber der Self-Join zeigt die tatsächlich problematischen Paare direkt nebeneinander.

SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
  ON a.email = b.email
 AND a.id < b.id;

Benachbarte Datensätze vergleichen

Eine häufige Aufgabe für Analysten: Vergleichen Sie jede Zeile mit der nächsten in der Reihenfolge, zum Beispiel die Verkäufe jedes Tages mit denen des Vortags. Ein Self-Join kann aufeinanderfolgende Zeilen paaren.

Hier verknüpfen wir jeden Tag mit der Zeile genau einen Tag zuvor, um eine Differenz zu berechnen. Das funktioniert, wenn die Sequenz keine Lücken enthält.

SELECT t.day, t.amount,
       t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
  ON y.day = t.day - INTERVAL '1 day';

Das Lückenproblem bei Self-Joins benachbarter Zeilen

Die vorherige Abfrage schlägt fehl, wenn ein Tag fehlt: Es gibt keine Zeile genau einen Tag zuvor, sodass diese Zeile herausfällt (Inner Join) oder Sie NULL-Werte behandeln müssen.

Deshalb lenken Interviewer Sie häufig zu Fensterfunktionen wie LAG für „mit der vorherigen Zeile vergleichen“. Diese verwenden die ordinale Position statt einer Wertübereinstimmung und tolerieren Lücken problemlos.

-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
       amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;

Self-Join vs. Window-Funktion

Kennen Sie den Kompromiss:

  • Ein Self-Join vergleicht Zeilen anhand einer Beziehung zwischen Werten (gleiche Abteilung, früheres Datum). Er ist flexibel, kann aber zu einer Zeilenvervielfachung führen und Lücken falsch behandeln.
  • Eine Window-Funktion vergleicht Zeilen anhand ihrer ordinalen Position innerhalb einer sortierten Partition. Sie eignet sich besser für die Logik mit vorherigen und nächsten Zeilen.

Verwenden Sie für den Vergleich mit der benachbarten Zeile bevorzugt LAG/LEAD. Wenn Sie alle Paare finden möchten, die eine Bedingung erfüllen, ist der Self-Join das natürliche Werkzeug.

Zeilen finden, die ihre Vergleichszeilen übertreffen

Ein weiteres Muster: Finden Sie Mitarbeiter, die mehr verdienen als mindestens ein Kollege in ihrer Abteilung. Ein Self-Join bildet dies direkt ab.

Wir verknüpfen jeden Mitarbeiter mit anderen Mitarbeitern in derselben Abteilung, die weniger verdienen, und behalten anschließend die unterschiedlichen Mitarbeiter, die dabei vorkommen. Das liest sich beinahe wie der englische Satz.

SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.salary > b.salary;

Achten Sie auf den Fan-out

Self-Joins über eine nicht eindeutige Spalte vervielfachen Zeilen. Die Paarbildung innerhalb einer Abteilung mit 100 Personen ergibt vor der Filterung etwa 100 x 100 mögliche Paare.

Fügen Sie stets die Bedingung zur Vermeidung von Duplikaten hinzu (a.id < b.id) und verwenden Sie DISTINCT oder eine Gruppierung, wenn Sie nur die beteiligten Zeilen und nicht jedes einzelne Paar benötigen. Erwähnen Sie dieses Bewusstsein für die Zeilenvervielfachung in Vorstellungsgesprächen.

Das passende Vergleichswerkzeug auswählen

Entscheidungshilfe für Vergleiche innerhalb einer Tabelle:

  • Alle passenden Paare (Duplikate, Kombinationen innerhalb derselben Gruppe): Self-Join mit a.id < b.id.
  • Vorherige/nächste Zeile in einer Reihenfolge: Window-Funktion (LAG/LEAD).
  • Jede Zeile mit einem Gruppenaggregat vergleichen: korrelierte Unterabfrage oder Window-Aggregat.

Schnelltest

Sie möchten jedes eindeutige Produktpaar finden, das dieselbe Kategorie hat, wobei kein Produkt mit sich selbst gepaart werden darf und keine doppelte Reihenfolge vorkommen soll.

Zusammenfassung: Zeilen innerhalb einer Tabelle vergleichen

Die wichtigsten Punkte:

  • Verknüpfen Sie die Tabelle per Self-Join mit sich selbst, um Duplikate und Kombinationen innerhalb derselben Gruppe zu finden.
  • Verwenden Sie a.id < b.id, um Selbstpaare und gespiegelte Duplikate mit einer einzigen Bedingung auszuschließen.
  • Vergleiche benachbarter Zeilen per Self-Join funktionieren bei Lücken nicht zuverlässig; bevorzugen Sie LAG/LEAD für die Logik mit vorherigen und nächsten Zeilen.
  • Berücksichtigen Sie beim Verknüpfen über nicht eindeutige Spalten stets den Fan-out.

Häufig gestellte Fragen

Ist die Lektion „Zeilen innerhalb einer Tabelle vergleichen“ kostenlos?

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

Was lerne ich in „Zeilen innerhalb einer Tabelle vergleichen“?

SELF-JOIN-Muster zum Finden von Paaren, Duplikaten und benachbarten Datensätzen Du übst SQL 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 SQL Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. SQL 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 3 von 4.

Wie lange dauert die Lektion „Zeilen innerhalb einer Tabelle vergleichen“?

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 SQL Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede SQL 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. CROSS JOIN und kartesische Produkte
  2. SELF JOIN für Hierarchien
  3. Zeilen innerhalb einer Tabelle vergleichen
  4. Den passenden JOIN-Typ auswählen
← Zurück zu SQL Interview Prep