Más como una subconsulta correlacionada
Una LATERAL
unió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 LATERAL
unió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 LATERAL
unió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 LATERAL
combinació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 FROM
cláusula. Al igual que unnest()
con múltiples parámetros en Postgres 9.4 o posterior. El manual:
Esto solo está permitido en la FROM
clá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 FROM
cláusula es una notación corta para CROSS JOIN
.
LATERAL
se asume automáticamente para funciones de tabla.
Más sobre el caso especial de UNNEST( array_expression [, ... ] )
:
Establecer funciones de retorno en la SELECT
lista
También puede usar funciones de devolución de conjuntos como unnest()
en la SELECT
lista directamente. Esto solía exhibir un comportamiento sorprendente con más de una de esas funciones en la misma SELECT
lista 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 INNER
y OUTER
join, 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 JOIN
ninguna 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 JOIN
no requiere una condición de unión) y el de @ Attila no es válido.
apply
es el mismo que ellateral
del estándar SQL)