Desde que Postgres salió con la capacidad de hacer LATERALuniones, 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 LATERALuniones 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 LATERALunión? ¿Cuál es la diferencia entre una LATERALunión y una subconsulta?
sql
postgresql
subquery
lateral-join
jdotjdot
fuente
fuente

applyes el mismo que ellateraldel estándar SQL)Respuestas:
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 unaLATERALunió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
LATERALEs 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 laFROMclá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 laFROMcláusula es una notación corta paraCROSS 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
SELECTlistaTambién puede usar funciones de devolución de conjuntos como
unnest()en laSELECTlista directamente. Esto solía exhibir un comportamiento sorprendente con más de una de esas funciones en la mismaSELECTlista 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 JOINno requiere una condición de unión) y el de @ Attila noesválido.fuente
LATERALsubconsulta: gis.stackexchange.com/a/230070/7244La diferencia entre un no
lateraly unalateralunió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.col1puede asumir muchos valores.Por el contrario, la subconsulta después de una no
lateralunión se puede evaluar una vez:Como se requiere sin
lateral, la consulta interna no depende de ninguna manera de la consulta externa. Unalateralconsulta es un ejemplo decorrelatedconsulta, 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
laterallugar deapply. ¿Quizás Microsoft patentó la sintaxis?lateralestá en el estándar SQL peroapplyno lo está.LEFT JOINrequiere una condición de unión. Hazlo aON TRUEmenos que quieras restringirlo de alguna manera.cross joino unaoncondiciónUna cosa que nadie ha señalado es que puede usar
LATERALconsultas 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