Más como una subconsulta correlacionada
Una LATERALunión (Postgres 9.3 o posterior) se parece más a una subconsulta correlacionada , no a una subconsulta simple. Como señaló Andomar , una función o subconsulta a la derecha de una LATERALunión debe evaluarse una vez por cada fila a la izquierda de la misma, al igual que una subconsulta correlacionada , mientras que una subconsulta simple (expresión de tabla) se evalúa solo una vez . (Sin embargo, el planificador de consultas tiene formas de optimizar el rendimiento para ambos).
Esta respuesta relacionada tiene ejemplos de código para ambos lado a lado, resolviendo el mismo problema:
Para devolver más de una columna , una LATERALunión suele ser más simple, limpia y rápida.
Además, recuerde que el equivalente de una subconsulta correlacionada es LEFT JOIN LATERAL ... ON true:
Lea el manual en LATERAL
Es más autoritario que cualquier cosa que vamos a poner aquí en respuestas:
Cosas que una subconsulta no puede hacer
No son cosas que una LATERALcombinación puede hacer, pero un (correlacionados) subconsulta no puede (fácilmente). Una subconsulta correlacionada solo puede devolver un valor único, no columnas múltiples ni filas múltiples, con la excepción de las llamadas a funciones desnudas (que multiplican las filas de resultados si devuelven varias filas). Pero incluso ciertas funciones de devolución de conjuntos solo están permitidas en la FROMcláusula. Al igual que unnest()con múltiples parámetros en Postgres 9.4 o posterior. El manual:
Esto solo está permitido en la FROMcláusula;
Entonces esto funciona, pero no se puede reemplazar fácilmente con una subconsulta:
CREATE TABLE tbl (a1 int[], a2 int[]);
SELECT * FROM tbl, unnest(a1, a2) u(elem1, elem2); -- implicit LATERAL
La coma ( ,) en la FROMcláusula es una notación corta para CROSS JOIN.
LATERALse asume automáticamente para funciones de tabla.
Más sobre el caso especial de UNNEST( array_expression [, ... ] ):
Establecer funciones de retorno en la SELECTlista
También puede usar funciones de devolución de conjuntos como unnest()en la SELECTlista directamente. Esto solía exhibir un comportamiento sorprendente con más de una de esas funciones en la misma SELECTlista hasta Postgres 9.6. Pero finalmente se ha desinfectado con Postgres 10 y ahora es una alternativa válida (incluso si no es SQL estándar). Ver:
Sobre la base del ejemplo anterior:
SELECT *, unnest(a1) AS elem1, unnest(a2) AS elem2
FROM tbl;
Comparación:
dbfiddle para pg 9.6 aquí
dbfiddle para pg 10 aquí
Aclarar información errónea
El manual:
Para los tipos INNERy OUTERjoin, se debe especificar una condición de combinación, es decir, exactamente una de NATURAL, ON join_condition o USING( join_column [, ...]). Vea a continuación el significado.
Porque CROSS JOINninguna de estas cláusulas puede aparecer.
Estas dos consultas son válidas (incluso si no son particularmente útiles):
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t ON TRUE;
SELECT *
FROM tbl t, LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
Si bien este no es:
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
Es por eso que el ejemplo de código de @ Andomar es correcto ( CROSS JOINno requiere una condición de unión) y el de @ Attila no es válido.
applyes el mismo que ellateraldel estándar SQL)