Tabele Derivate LATERAL în MySQL 8 (Subinterogări Corelate în FROM) în MySQL

Legarea tabelelor (JOIN) MySQL 8.0.14+

Permiterea unei subinterogări din clauza FROM să acceseze coloanele tabelelor anterioare: top N rezultate per grup și calcule dinamice pe rând.

Sintaxă
SELECT c.nume, top_comenzi.total FROM clienti c, LATERAL (SELECT * FROM comenzi WHERE client_id = c.id ORDER BY data DESC LIMIT 3) top_comenzi;

În mod standard în SQL, o subinterogare plasată în clauza FROM (numită Derived Table) este complet izolată: ea nu poate accesa sau referi coloanele altor tabele declarate înaintea ei în aceeași clauză FROM.

Cuvântul cheie LATERAL (introdus în MySQL 8.0.14) elimină această restricție, funcționând similar unei bucle for-each: permite subinterogării derivate să acceseze coloane din rândul curent al tabelului din stânga. Acest lucru rezolvă elegant problema clasică „Top N rezultate pentru fiecare categorie / client”.

Scenariu: Selectarea celor mai recente 2 comenzi pentru fiecare client
-- Fără LATERAL, această problemă necesita subinterogări complexe și lente.
-- Cu LATERAL, interogarea din dreapta are acces direct la c.id:
SELECT 
    c.id AS client_id,
    c.nume,
    ultimele_comenzi.id AS comanda_id,
    ultimele_comenzi.total,
    ultimele_comenzi.data_plasare
FROM clienti c,
LATERAL (
    SELECT id, total, data_plasare
    FROM comenzi
    WHERE client_id = c.id -- Referință către tabelul părinte din stânga!
    ORDER BY data_plasare DESC
    LIMIT 2
) AS ultimele_comenzi;

Diferența dintre LATERAL și un JOIN Obișnuit

Un JOIN obișnuit evaluează ambele tabele independent și le combină prin condiția ON. Un LATERAL JOIN re-evaluează subinterogarea pentru fiecare rând în parte din tabelul exterior, permițând aplicarea de clauze LIMIT, agregări specifice sau calcule de ferestre direct la nivelul fiecărei entități individuale.