Desde que Postgres salió con la capacidad de hacer LATERAL
uniones, lo he estado leyendo, ya que actualmente hago volcados de datos complejos para mi equipo con muchas subconsultas ineficientes que hacen que la consulta general tome cuatro minutos o más.
Entiendo que las LATERAL
uniones pueden ayudarme, pero incluso después de leer artículos como este de Heap Analytics, todavía no lo sigo.
¿Cuál es el caso de uso de una LATERAL
unión? ¿Cuál es la diferencia entre una LATERAL
unión y una subconsulta?
sql
postgresql
subquery
lateral-join
jdotjdot
fuente
fuente
apply
es el mismo que ellateral
del estándar SQL)Respuestas:
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 unaLATERAL
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 laFROM
cláusula. Al igual queunnest()
con múltiples parámetros en Postgres 9.4 o posterior. El manual:Entonces esto funciona, pero no se puede reemplazar fácilmente con una subconsulta:
La coma (
,
) en laFROM
cláusula es una notación corta paraCROSS 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
listaTambién puede usar funciones de devolución de conjuntos como
unnest()
en laSELECT
lista directamente. Esto solía exhibir un comportamiento sorprendente con más de una de esas funciones en la mismaSELECT
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:
Comparación:
dbfiddle para pg 9.6 aquí
dbfiddle para pg 10 aquí
Aclarar información errónea
El manual:
Estas dos consultas son válidas (incluso si no son particularmente útiles):
Si bien este no es:
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 noesválido.fuente
LATERAL
subconsulta: gis.stackexchange.com/a/230070/7244La diferencia entre un no
lateral
y unalateral
unión radica en si puede mirar a la fila de la tabla de la izquierda. Por ejemplo:Esta "mirada hacia afuera" significa que la subconsulta debe evaluarse más de una vez. Después de todo,
t1.col1
puede asumir muchos valores.Por el contrario, la subconsulta después de una no
lateral
unión se puede evaluar una vez:Como se requiere sin
lateral
, la consulta interna no depende de ninguna manera de la consulta externa. Unalateral
consulta es un ejemplo decorrelated
consulta, debido a su relación con filas fuera de la consulta misma.fuente
select * from table1 left join t2 using (col1)
compara? No está claro para mí cuando una combinación usando / en condición es insuficiente y tendría más sentido usar lateral.Primero, Lateral y Cross Apply es lo mismo . Por lo tanto, también puede leer sobre Cross Apply. Dado que se implementó en SQL Server durante siglos, encontrará más información al respecto que Lateral.
En segundo lugar, según tengo entendido , no hay nada que no pueda hacer usando subconsulta en lugar de usar lateral. Pero:
Considere la siguiente consulta.
Puede usar lateral en esta condición.
En esta consulta no puede usar la unión normal, debido a la cláusula de límite. La aplicación lateral o cruzada se puede usar cuando no hay una condición de unión simple .
Hay más usos para la aplicación lateral o cruzada, pero este es el más común que encontré.
fuente
lateral
lugar deapply
. ¿Quizás Microsoft patentó la sintaxis?lateral
está en el estándar SQL peroapply
no lo está.LEFT JOIN
requiere una condición de unión. Hazlo aON TRUE
menos que quieras restringirlo de alguna manera.cross join
o unaon
condiciónUna cosa que nadie ha señalado es que puede usar
LATERAL
consultas para aplicar una función definida por el usuario en cada fila seleccionada.Por ejemplo:
Esa es la única forma en que sé cómo hacer este tipo de cosas en PostgreSQL.
fuente