Tema SQL
LATERAL y APPLY (CROSS / OUTER)
Evaluar una subconsulta o función por cada fila de la tabla izquierda, como un JOIN correlacionado explícito.
Descripción
PostgreSQL usa FROM tabla, LATERAL (subconsulta). SQL Server ofrece CROSS APPLY (como INNER) y OUTER APPLY (como LEFT): la parte derecha se ejecuta en contexto de cada fila izquierda. Útil para top-N por grupo, funciones que devuelven conjuntos o descomponer JSON.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
-- PostgreSQL (subconsulta lateral)
SELECT *
FROM clientes c,
LATERAL (SELECT * FROM pedidos p WHERE p.cliente_id = c.id LIMIT 3) t;
-- SQL Server
SELECT *
FROM clientes c
CROSS APPLY (SELECT TOP 3 * FROM pedidos p WHERE p.cliente_id = c.id) t;
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- LATERAL
- La subconsulta lateral puede referenciar columnas de filas a su izquierda en el FROM.
- CROSS APPLY
- Solo filas donde la parte derecha devuelve al menos una fila (como INNER JOIN).
- OUTER APPLY
- Conserva filas izquierda aunque la derecha esté vacía (NULLs).
Ejemplos
Ejemplo 1
-- SQL Server: últimos 2 pedidos por cliente
SELECT c.nombre, t.id_pedido, t.total
FROM clientes c
OUTER APPLY (
SELECT TOP 2 id AS id_pedido, total
FROM pedidos p
WHERE p.cliente_id = c.id
ORDER BY p.fecha DESC
) t;
Ejemplo 2
SELECT * FROM nums n CROSS JOIN LATERAL generate_series(1, n.n) AS g(i); -- estilo PostgreSQL
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.