Tema SQL
CROSS APPLY / OUTER APPLY (SQL Server)
Evalúa una expresión tabla por cada fila de la tabla izquierda (lateral implícito). CROSS APPLY es inner: solo filas con resultado; OUTER APPLY conserva izquierda con NULLs.
Descripción
FROM a CROSS APPLY (SELECT … WHERE correlación) b permite subconsultas parametrizadas por fila sin repetir lógica. Equivalente a LATERAL JOIN en PostgreSQL. Funciones con valores de tabla (TVF) son el caso típico. Evita APPLY sobre funciones costosas sin WHERE que recorten: puede explotar en cardinalidad. MySQL 8+ tiene LATERAL; versiones antiguas requieren trucos.
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.
FROM tabla_exterior AS e
CROSS APPLY (SELECT … WHERE … = e.id) AS interno
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.
- OUTER APPLY
- Como LEFT JOIN lateral cuando la derecha puede vaciarse.
- PostgreSQL
- CROSS JOIN LATERAL subquery.
Ejemplos
Ejemplo 1
SELECT c.id, t.ultima_fecha
FROM clientes c
CROSS APPLY (
SELECT MAX(fecha) AS ultima_fecha FROM pedidos p WHERE p.cliente_id = c.id
) AS t;
SELECT e.id, x.linea
FROM encabezados e
OUTER APPLY (SELECT TOP 1 * FROM lineas l WHERE l.enc_id = e.id ORDER BY l.id DESC) AS x;
Ejemplo 2
SELECT n.n, t.val
FROM (VALUES (1),(2),(3)) AS n(n)
CROSS APPLY (SELECT n * 10 AS val) AS t;
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.