CROSS JOIN – Kartesisches Produkt

6 Kernkonzepte
Die wichtigsten Konzepte für CROSS JOIN und kartesisches Produkt in SQL: CROSS JOIN · Kartesisches Produkt · Anwendungen · Mit WHERE · Performance · Praxis-Beispiele CROSS JOIN erzeugt alle Kombinationen von Zeilen zweier Tabellen – das kartesische Produkt. Er wird für Matrixoperationen, Kombinationslisten und Testdaten verwendet.

Grundlagen – Was ist ein CROSS JOIN?

Jede Zeile × Jede Zeile
-- Tabelle A: 3 Zeilen, Tabelle B: 4 Zeilen SELECT * FROM A CROSS JOIN B; -- Ergebnis: 3 × 4 = 12 Zeilen

CROSS JOIN (auch kartesisches Produkt) kombiniert jede Zeile der ersten Tabelle mit jeder Zeile der zweiten Tabelle. Die Anzahl der Ergebniszeilen ist |A| × |B|.

Beispiel
-- Tabelle farben: ['Rot', 'Grün', 'Blau']
-- Tabelle größen: ['S', 'M', 'L']
SELECT f.farbe, g.größe
FROM farben f CROSS JOIN größen g;
Ergebnis (3 × 3 = 9 Kombinationen):
Rot | S
Rot | M
Rot | L
Grün | S
Grün | M
Grün | L
Blau | S
Blau | M
Blau | L
Tipp: CROSS JOIN wird oft als FROM tabelle1, tabelle2 ohne JOIN-Bedingung geschrieben – das ist die ältere, aber weit verbreitete Syntax.

Syntax-Varianten – Verschiedene Schreibweisen

CROSS JOIN · FROM A, B · JOIN ON 1=1
-- Variante 1: CROSS JOIN (SQL-92) SELECT * FROM A CROSS JOIN B; -- Variante 2: Alte Syntax (implizit) SELECT * FROM A, B; -- Variante 3: INNER JOIN mit wahrer Bedingung SELECT * FROM A JOIN B ON 1 = 1;

CROSS JOIN kann auf drei Arten geschrieben werden: mit explizitem CROSS JOIN, mit der impliziten Komma-Syntax oder mit JOIN ON 1=1. Alle Varianten erzeugen das gleiche Ergebnis.

Beispiele
-- Explizit: CROSS JOIN
SELECT a.name, b.name
FROM mitarbeiter a CROSS JOIN projekte b;
-- Implizit (ältere Syntax)
SELECT a.name, b.name
FROM mitarbeiter a, projekte b;
-- JOIN mit wahrer Bedingung (selten verwendet)
SELECT a.name, b.name
FROM mitarbeiter a JOIN projekte b ON 1 = 1;
Tipp: Die explizite CROSS JOIN-Syntax ist die beste Wahl – sie macht die Absicht klar und ist weniger fehleranfällig als die implizite Komma-Syntax.

Anwendungen – Wofür wird CROSS JOIN verwendet?

Kombinationen · Matrix · Testdaten
-- Alle Kombinationen von Größen und Farben SELECT g.größe, f.farbe FROM größen g CROSS JOIN farben f;

CROSS JOIN wird verwendet, wenn Sie alle möglichen Kombinationen zwischen zwei oder mehreren Datensätzen benötigen – z.B. für Matrixoperationen, Produktvarianten oder Testdaten.

Häufige Anwendungsfälle

Anwendung Beschreibung
Produktvarianten Alle Kombinationen von Größen und Farben für ein Produkt
Matrixoperationen Berechnung von Kennzahlen für alle Kombinationen
Testdaten Generierung von Testdatensätzen für andere Queries
Berechnungen Kombinatorische Auswertungen (z.B. Preiskalkulation)
Pivot-Tabellen Grundlage für Kreuztabellen
Beispiele
-- Produktvarianten: Alle Kombinationen von Größen & Farben
SELECT p.name, g.größe, f.farbe
FROM produkte p
CROSS JOIN größen g
CROSS JOIN farben f
WHERE p.id = 1;
-- Alle Mitarbeiter × Projekte (Zuweisungsmatrix)
SELECT m.name AS "mitarbeiter", p.name AS "projekt"
FROM mitarbeiter m CROSS JOIN projekte p;
-- Testdaten für alle Kombinationen von Wochentagen und Monaten
SELECT w.wochentag, m.monat
FROM wochentage w CROSS JOIN monate m;
Tipp: CROSS JOIN ist ideal für die Generierung von Kombinationen, die in anderen JOIN-Typen nicht natürlich vorkommen – z.B. für Produktvarianten oder Matrix-Auswertungen.

CROSS JOIN mit WHERE – Nachträgliches Filtern

CROSS JOIN + WHERE (nicht empfohlen)
-- CROSS JOIN mit WHERE (versteckter JOIN) SELECT * FROM A, B WHERE A.id = B.foreign_id; -- Besser: INNER JOIN mit ON SELECT * FROM A JOIN B ON A.id = B.foreign_id;

CROSS JOIN mit WHERE ist die alte Methode, um Tabellen zu verbinden. Heute wird dafür INNER JOIN mit ON-Bedingung empfohlen – das ist klarer und weniger fehleranfällig.

Beispiele
-- Schlecht: CROSS JOIN + WHERE (versteckt)
SELECT * FROM bestellungen b, kunden k
WHERE b.kunde_id = k.id;
-- Gut: Expliziter INNER JOIN
SELECT * FROM bestellungen b
INNER JOIN kunden k ON b.kunde_id = k.id;
-- CROSS JOIN mit mehreren WHERE-Bedingungen
SELECT * FROM A, B, C
WHERE A.id = B.a_id
AND B.id = C.b_id;
⚠️ Warnung: Vergessen Sie bei der alten Komma-Syntax nie die WHERE-Bedingung! Sonst erhalten Sie versehentlich ein kartesisches Produkt, das schnell zu riesigen Ergebnismengen und Performance-Problemen führt.

Performance – Fallstricke und Optimierung

Riesige Ergebnismengen · Speicher · Laufzeit
-- Gefahr: Riesige Ergebnismenge SELECT * FROM große_tabelle CROSS JOIN andere_große_tabelle; -- 10.000 × 10.000 = 100.000.000 Zeilen!

Performance ist die größte Herausforderung bei CROSS JOIN. Die Ergebnismenge wächst exponentiell mit der Größe der Tabellen – ein CROSS JOIN über zwei 10.000-Zeilen-Tabellen erzeugt 100 Millionen Zeilen.

Performance-Tipps

Tipp Beschreibung
WHERE vor der Kombination Filtere zuerst, dann kombiniere (Subqueries oder CTEs)
LIMIT Verwende LIMIT, um die Ergebnismenge zu begrenzen
Nur benötigte Spalten SELECT nur die benötigten Spalten, nicht *
Aggregation statt großer Ergebnisse Manchmal reicht eine Aggregation statt der gesamten Kombinationsliste
Testen Teste mit kleinen Datenmengen oder LIMIT
Beispiele
-- Nur erste 100 Kombinationen (für Test)
SELECT * FROM A CROSS JOIN B
LIMIT 100;
-- Mit CTE vorfiltern
WITH große_gefiltert AS (
SELECT * FROM große_tabelle WHERE status = 'aktiv'
)
SELECT * FROM große_gefiltert a
CROSS JOIN andere_tabelle b
WHERE b.aktiv = true;
-- Aggregation statt Kombinationsliste
SELECT a.name, COUNT(b.id) AS "anzahl"
FROM A a CROSS JOIN B b
GROUP BY a.name;
⚠️ Kritisch: CROSS JOIN kann die Datenbank und den Client extrem belasten. Prüfen Sie vor der Ausführung die erwartete Zeilenanzahl! Bei großen Tabellen kann dies zu Performance-Einbrüchen oder sogar zum Absturz führen.

Praxis-Beispiele – CROSS JOIN in Aktion

Kombinationen · Matrix · Planung
-- Alle Produkte × alle Monate (Umsatzplanung) SELECT p.name, m.monat, 0 AS "umsatz" FROM produkte p CROSS JOIN monate m;

Praxis-Beispiele zeigen die Anwendung von CROSS JOIN für Planungs- und Kombinationsaufgaben – von Produktvarianten über Matrix-Auswertungen bis zur Testdatengenerierung.

Beispiele
-- 1. Produktvarianten generieren (alle Größen × Farben)
INSERT INTO varianten (produkt_id, größe, farbe)
SELECT p.id, g.name, f.name
FROM produkte p
CROSS JOIN größen g
CROSS JOIN farben f
WHERE p.aktiv = true;
-- 2. Matrix: Mitarbeiter × Fähigkeiten
SELECT m.name, s.fähigkeit,
CASE WHEN ms.mitarbeiter_id IS NOT NULL THEN '✓' ELSE '✗' END AS "hat"
FROM mitarbeiter m
CROSS JOIN fähigkeiten s
LEFT JOIN mitarbeiter_fähigkeiten ms
ON ms.mitarbeiter_id = m.id AND ms.fähigkeit_id = s.id;
-- 3. Planung: Produkte × Wochentage (z.B. Angebotsplanung)
SELECT p.name, w.tag,
'Aktion' AS "aktion"
FROM produkte p
CROSS JOIN wochentage w
WHERE p.kategorie = 'Lebensmittel';
-- 4. Testdaten für eine Pivot-Abfrage
SELECT d.datum, p.name, RANDOM() * 100 AS "umsatz"
FROM datumsreihe d
CROSS JOIN produkte p
WHERE d.datum BETWEEN '2024-01-01' AND '2024-01-31'
AND p.id IN (1, 2, 3)
ORDER BY d.datum, p.name;
Tipp: CROSS JOIN wird oft mit LEFT JOIN kombiniert, um zu zeigen, welche Kombinationen bereits existieren und welche nicht – wie in der Matrix-Abfrage (Mitarbeiter × Fähigkeiten).

CROSS JOIN im Überblick

× Kartesisches Produkt
|A| × |B| Zeilen
CROSS JOIN Explizite Syntax
Klar und lesbar
FROM A, B Implizite Syntax
Alte Methode
JOIN ON 1=1 Trick-Variante
Selten verwendet
Kombinationen Anwendungen
Varianten, Matrix
Performance Achtung!
Ergebnismenge

Quick Summary

CROSS JOIN
Kartesisches Produkt
FROM A, B
Implizite Syntax
Kombinationen
Varianten generieren
WHERE
Nachträglich filtern
Performance
Achtung bei großen Tabellen
Matrix
Mitarbeiter × Fähigkeiten
SELECT * FROM A CROSS JOIN B; · SELECT * FROM A, B WHERE A.id = B.foreign_id;