ARRAY JOIN.
Su nombre proviene de que puede interpretarse como la ejecución de un JOIN con un array o una estructura de datos anidada. Su propósito es similar al de la función arrayJoin, pero la funcionalidad de la cláusula es más amplia.
Las formas de origen de tabla
FROM unnest(...), CROSS JOIN UNNEST(...) y LATERAL unnest(...) de PostgreSQL no son compatibles. Use ARRAY JOIN en su lugar. El nombre unnest (desde la versión 26.5) es un alias de llamada de función de arrayJoin (SELECT unnest(arr)), no una función de tabla. JOIN LATERAL <subquery> sobre una subconsulta correlacionada se admite por separado como funcionalidad experimental; consulte JOIN.ARRAY JOIN admitidos:
ARRAY JOIN- En el caso base, los arrays vacíos no se incluyen en el resultado deJOIN.LEFT ARRAY JOIN- El resultado deJOINcontiene filas con arrays vacíos. El valor de un array vacío se establece en el valor predeterminado del tipo de elemento del array (normalmente 0, una cadena vacía o NULL).
Ejemplos básicos de ARRAY JOIN
ARRAY JOIN y LEFT ARRAY JOIN
Los ejemplos siguientes muestran el uso de las cláusulasARRAY JOIN y LEFT ARRAY JOIN. Vamos a crear una tabla con una columna de tipo Array e insertar valores en ella:
ARRAY JOIN:
LEFT ARRAY JOIN:
ARRAY JOIN y la función arrayEnumerate
Esta función se usa normalmente conARRAY JOIN. Permite contar algo solo una vez por cada array después de aplicar ARRAY JOIN. Ejemplo:
ARRAY JOIN) y Hits es el número de páginas vistas (las cadenas antes de ARRAY JOIN). En este caso concreto, puede obtener el mismo resultado de una forma más sencilla:
ARRAY JOIN y arrayEnumerateUniq
Esta función es útil cuando se usaARRAY JOIN y se agregan elementos de un array.
En este ejemplo, para cada ID de objetivo se calcula el número de conversiones (cada elemento de la estructura de datos anidada Goals es un objetivo alcanzado, al que nos referimos como una conversión) y el número de sesiones. Sin ARRAY JOIN, habríamos contado el número de sesiones como sum(Sign). Pero en este caso concreto, las filas se multiplicaron por la estructura anidada Goals, así que, para contar cada sesión una sola vez después de esto, aplicamos una condición al valor de la función arrayEnumerateUniq(Goals.ID).
Uso de alias
Se puede especificar un alias para un array en la cláusulaARRAY JOIN. En este caso, se puede acceder a un elemento del array mediante ese alias, pero al propio array se accede mediante su nombre original. Ejemplo:
ARRAY JOIN con un array externo. Por ejemplo:
ARRAY JOIN. En este caso, el JOIN se realiza sobre ellos simultáneamente (la suma directa, no el producto cartesiano). Tenga en cuenta que, de forma predeterminada, todos los arrays deben tener el mismo tamaño. Ejemplo:
SETTINGS enable_unaligned_array_join = 1. Ejemplo:
ARRAY JOIN con estructuras de datos anidadas
ARRAY JOIN también funciona con estructuras de datos anidadas:
ARRAY JOIN, el significado es el mismo que el de ARRAY JOIN con todos los elementos del array que la componen. A continuación se muestran ejemplos:
JOIN o el array de origen. Ejemplo:
Detalles de implementación
El orden de ejecución de la consulta se optimiza al ejecutarARRAY JOIN. Aunque ARRAY JOIN siempre debe especificarse antes de la cláusula WHERE/PREWHERE en una consulta, técnicamente pueden ejecutarse en cualquier orden, a menos que el resultado de ARRAY JOIN se use como filtro. El optimizador de consultas controla el orden de ejecución.
Incompatibilidad con la evaluación de funciones con cortocircuito
La evaluación de funciones con cortocircuito es una característica que optimiza la ejecución de expresiones complejas en funciones específicas comoif, multiIf, and y or. Evita que se produzcan posibles excepciones, como la división entre cero, durante la ejecución de estas funciones.
arrayJoin siempre se ejecuta y no es compatible con la evaluación de funciones con cortocircuito. Esto se debe a que es una función especial que se procesa por separado de todas las demás funciones durante el análisis y la ejecución de la consulta, y requiere una lógica adicional que no funciona con la ejecución con cortocircuito. La razón es que el número de filas del resultado depende del resultado de arrayJoin, e implementar la ejecución diferida de arrayJoin es demasiado complejo y costoso.