0Pricing
SQL Academy · Lezione

Join laterali (LATERAL JOIN)

Faccia riferimento all’elemento FROM precedente dall’interno di una sottoquery con LATERAL: l’equivalente SQL di una chiamata di funzione per ogni riga

Join laterali (LATERAL JOIN) è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 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 SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Che cos'è LATERAL?

LATERAL consente a una sottoquery nella clausola FROM di fare riferimento alle colonne degli elementi precedenti nell'elenco FROM. Senza LATERAL, gli elementi di FROM non possono accedere l'uno all'altro.

Modello mentale

LATERAL significa "per ogni riga del lato sinistro, valuti questa query". È simile a una sottoquery correlata, ma si trova nella clausola FROM e può restituire più righe e colonne.

I 3 ordini principali per utente

Il caso d'uso classico di LATERAL:

SELECT u.id, u.email, o.id AS order_id, o.total
FROM users u
JOIN LATERAL (
  SELECT id, total FROM orders
  WHERE user_id = u.id
  ORDER BY total DESC
  LIMIT 3
) AS o ON true;

Perché non usare una sottoquery in SELECT?

Una sottoquery scalare in SELECT restituisce un valore. LATERAL restituisce più righe e più colonne per ogni riga esterna.

LATERAL con le funzioni

Le funzioni che restituiscono insiemi sono LATERAL per impostazione predefinita:

SELECT t.id, unnest_tag
FROM posts t
CROSS JOIN LATERAL unnest(t.tags) AS unnest_tag;

-- Equivalent (set-returning functions are implicit LATERAL):
SELECT t.id, unnest_tag
FROM posts t, unnest(t.tags) AS unnest_tag;

LATERAL rispetto alle funzioni finestra

Per ottenere i "primi N per gruppo", sia LATERAL sia ROW_NUMBER funzionano. ROW_NUMBER è spesso più efficiente perché percorre la tabella una sola volta; LATERAL esegue nuovamente la query per ogni riga esterna.

-- ROW_NUMBER alternative:
WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
  FROM orders
)
SELECT u.email, r.id, r.total
FROM users u
JOIN ranked r ON r.user_id = u.id
WHERE r.rn <= 3;

LATERAL con gli aggregati

Valori precalcolati per ogni riga:

SELECT u.email, stats.last_order_at, stats.total_orders
FROM users u
LEFT JOIN LATERAL (
  SELECT MAX(created_at) AS last_order_at,
         COUNT(*)        AS total_orders
  FROM orders WHERE user_id = u.id
) AS stats ON true;

ON true

LATERAL richiede una clausola ON per JOIN, ma la condizione di join si trova nella sottoquery; per questo l'ON esterno è true.

CROSS JOIN LATERAL rispetto a LEFT JOIN LATERAL

  • CROSS JOIN LATERAL: la riga esterna viene scartata se la query interna non restituisce righe
  • LEFT JOIN LATERAL ... ON true: la riga esterna viene mantenuta con colonne NULL

LATERAL per le query sulle distanze

Il negozio più vicino per ogni utente:

SELECT u.id, s.name, s.distance
FROM users u
CROSS JOIN LATERAL (
  SELECT name, location <-> u.location AS distance
  FROM stores
  ORDER BY location <-> u.location
  LIMIT 1
) AS s;

LATERAL è uno standard SQL

Standardizzato in SQL:1999. PostgreSQL lo implementa come LATERAL; SQL Server usa CROSS APPLY / OUTER APPLY.

Prestazioni

LATERAL viene eseguito una volta per ogni riga esterna. Con un indice adeguato sulla tabella interna, ogni iterazione è rapida. Senza un indice, può diventare lento su larga scala.

Riepilogo

LATERAL = "sottoquery in FROM che vede la riga esterna".

  • Primi N per gruppo
  • Precalcolo per riga
  • Funzioni che restituiscono insiemi
  • Lo combini con LEFT JOIN ... ON true per ottenere outer join

Verifica rapida

Che cosa consente LATERAL che una normale sottoquery in FROM non consente?

Domande Frequenti

La lezione «Join laterali (LATERAL JOIN)» è gratuita?

Sì — il testo completo di «Join laterali (LATERAL JOIN)» è 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 SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Join laterali (LATERAL JOIN)»?

Faccia riferimento all’elemento FROM precedente dall’interno di una sottoquery con LATERAL: l’equivalente SQL di una chiamata di funzione per ogni riga Eserciti SQL Academy 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 SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Join laterali (LATERAL JOIN)»?

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 SQL Academy?

Sì. Ogni lezione SQL Academy 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

  1. Cross join e prodotti cartesiani
  2. Join laterali (LATERAL JOIN)
  3. Anti-join e semi-join (NOT EXISTS)
  4. Ottimizzazione delle prestazioni delle join tra più tabelle
← Torna a SQL Academy