CROSS JOIN e prodotti cartesiani
Usare cross join intenzionali per generare combinazioni ed evitare quelli accidentali che fanno esplodere il numero di righe
CROSS JOIN e prodotti cartesiani è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.
Il JOIN che gli intervistatori usano per metterla alla prova
Un CROSS JOIN abbina ogni riga della tabella a sinistra a ogni riga della tabella a destra. Non esiste alcuna condizione ON. Se la tabella A ha 4 righe e la tabella B ne ha 3, il risultato contiene 4 x 3 = 12 righe.
Questo si chiama prodotto cartesiano. Gli intervistatori ne chiedono informazioni per due motivi: verificare se sa generare combinazioni intenzionalmente e capire se riconosce un cross join accidentale che fa esplodere il numero di righe del risultato.
Sintassi esplicita di CROSS JOIN
Il modo moderno e leggibile di scrivere un prodotto cartesiano consiste nell'usare la parola chiave esplicita CROSS JOIN. Noti che non è presente alcuna clausola ON: questo comunica chiaramente l'intento a chi esamina la query.
Qui abbiniamo ogni taglia a ogni colore per creare una matrice completa dei prodotti.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;La vecchia sintassi con la virgola
Capiterà ancora di vedere prodotti cartesiani scritti con una virgola nella clausola FROM e senza alcuna condizione di join. Questa è la sintassi ANSI legacy.
Produce esattamente lo stesso risultato di CROSS JOIN, ma è rischiosa: se intendeva aggiungere una condizione di join e se ne è dimenticato, ottiene silenziosamente un cross join invece di un errore. Preferisca CROSS JOIN esplicito.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;Un esempio completo: creare una tabella delle taglie
Supponga che un negozio venda magliette in 3 taglie e 4 colori e voglia una riga per ogni variante possibile, comprese quelle non ancora disponibili. Un cross join genera tutte le 12 combinazioni in un solo passaggio.
Questo è l'uso intenzionale più comune: produrre una griglia completa di opzioni.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;Generare una griglia di calendario
Un altro classico uso di CROSS JOIN nei colloqui tecnici consiste nel creare una griglia densa, in cui sia presente ogni combinazione anche quando mancano dei dati.
Qui incrociamo ogni negozio con ogni data, così un successivo LEFT JOIN sulle vendite restituisce una riga per negozio e per giorno, riempiendo i dati mancanti con zeri. Il cross join garantisce che nessuna coppia negozio-giorno venga saltata.
SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';L'esplosione cartesiana accidentale
Il pericolo su cui gli intervistatori insistono: si uniscono due tabelle ma si dimentica la condizione di join. Invece di generare un errore, il database restituisce tranquillamente ogni combinazione.
Se orders contiene 100.000 righe e customers ne contiene 50.000, il risultato è di 5 miliardi di righe. Le query rimangono in attesa, la memoria si esaurisce e i numeri risultano enormemente gonfiati. Riconoscere questo schema durante una revisione del codice è un segnale positivo.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rowsCome individuare un cross join accidentale
Sintomi che gli intervistatori si aspettano che sappia indicare:
- Il numero di righe è all'incirca il prodotto delle dimensioni delle due tabelle, non la somma.
- Gli aggregati come
SUMrisultano moltiplicati per un fattore costante. - Il piano di esecuzione mostra un Nested Loop senza alcun filtro di join.
La correzione consiste quasi sempre nell'aggiungere un'uguaglianza ON o WHERE mancante tra le tabelle.
CROSS JOIN rispetto a INNER JOIN con ON sempre vero
Un CROSS JOIN è logicamente identico a un INNER JOIN ... ON 1=1. Entrambi producono il prodotto cartesiano completo.
In effetti, un inner join non è altro che un cross join seguito da un filtro sulla condizione ON. Questo modello mentale spiega perché l'assenza della condizione trasforma un inner join in un cross join.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;Eseguire un cross join con una tabella dei numeri
Un trucco potente consiste nell'eseguire un cross join con una piccola tabella numbers o generate_series per moltiplicare intenzionalmente le righe. Si usa per espandere una singola riga in molte righe, ad esempio per trasformare una quantità in singole righe, una per unità.
Qui ogni riga di prodotto viene ripetuta qty volte eseguendo il join con una sequenza e mantenendo i numeri fino alla quantità indicata.
SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;Prestazioni e pratiche sicure
Poiché l'output cresce in modo moltiplicativo, non esegua mai un cross join tra due tabelle di grandi dimensioni. Mantenga almeno un lato molto piccolo, ad esempio un elenco di taglie, un calendario ridotto o una tabella dei numeri.
Nei colloqui, lo dichiari esplicitamente: "Un CROSS JOIN è sicuro solo quando uno dei due lati è piccolo e ha dimensioni limitate; in caso contrario, il risultato è ingestibile." Questa frase dimostra capacità di giudizio, non soltanto conoscenza della sintassi.
Quando usare CROSS JOIN
Usi un CROSS JOIN intenzionale quando servono tutte le combinazioni di due insiemi:
- Generare matrici di opzioni (taglia x colore).
- Rendere dense le serie temporali (negozio x giorno) prima di un LEFT JOIN.
- Espandere le righe tramite una tabella dei numeri.
Se non desidera tutte le combinazioni, quasi certamente le serve un join con una condizione ON.
Verifica rapida
Verifichi la propria comprensione dei prodotti cartesiani.
Riepilogo: CROSS JOIN
Punti chiave:
- Un CROSS JOIN abbina ogni riga a sinistra a ogni riga a destra; la dimensione dell'output è il prodotto delle dimensioni degli input.
- La sintassi con la virgola e senza condizioni produce lo stesso prodotto cartesiano, spesso accidentalmente.
- Lo usi intenzionalmente per creare griglie di combinazioni, rendere dense le serie temporali ed espandere le righe tramite una tabella dei numeri.
- Un inner join a cui manca
ONsi trasforma silenziosamente in un cross join: il bug dell'esplosione che gli intervistatori adorano.
Domande Frequenti
La lezione «CROSS JOIN e prodotti cartesiani» è gratuita?
Sì — il testo completo di «CROSS JOIN e prodotti cartesiani» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.
Cosa imparerò in «CROSS JOIN e prodotti cartesiani»?
Usare cross join intenzionali per generare combinazioni ed evitare quelli accidentali che fanno esplodere il numero di righe Eserciti Coding Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Coding Interview Prep?
Non è richiesta alcuna esperienza precedente. Coding Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «CROSS JOIN e prodotti cartesiani»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Coding Interview Prep?
Sì. Ogni lezione Coding Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- CROSS JOIN e prodotti cartesiani
- SELF JOIN per le gerarchie
- Confrontare le righe all'interno di una tabella
- Scegliere il tipo di join corretto