Es una operación habitual en las tablas que contienen una columna de tipo Array generar una nueva tabla con una fila por cada elemento individual del array de esa columna original, mientras que los valores de las demás columnas se duplican. Este es el caso básico de lo que hace la cláusula 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.
Sintaxis:
A continuación se enumeran los tipos de ARRAY JOIN admitidos:
ARRAY JOIN - En el caso base, los arrays vacíos no se incluyen en el resultado de JOIN.
LEFT ARRAY JOIN - El resultado de JOIN contiene 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áusulas ARRAY JOIN y LEFT ARRAY JOIN. Vamos a crear una tabla con una columna de tipo Array e insertar valores en ella:
En el ejemplo siguiente se usa la cláusula ARRAY JOIN:
En el siguiente ejemplo se usa la cláusula LEFT ARRAY JOIN:
ARRAY JOIN y la función arrayEnumerate
Esta función se usa normalmente con ARRAY JOIN. Permite contar algo solo una vez por cada array después de aplicar ARRAY JOIN. Ejemplo:
En este ejemplo, Reaches es el número de conversiones (las cadenas obtenidas tras aplicar 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 usa ARRAY 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).
Se puede especificar un alias para un array en la cláusula ARRAY 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:
Con alias, puede realizar ARRAY JOIN con un array externo. Por ejemplo:
Se pueden separar varios arrays con comas en la cláusula 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:
El siguiente ejemplo utiliza la función arrayEnumerate:
Se pueden unir varios arrays de distinto tamaño usando: SETTINGS enable_unaligned_array_join = 1. Ejemplo:
ARRAY JOIN con estructuras de datos anidadas
ARRAY JOIN también funciona con estructuras de datos anidadas:
Al especificar nombres de estructuras de datos anidadas en 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:
Esta variante también tiene sentido:
Se puede usar un alias para una estructura de datos anidada para seleccionar el resultado de JOIN o el array de origen. Ejemplo:
Ejemplo de uso de la función arrayEnumerate:
Detalles de implementación
El orden de ejecución de la consulta se optimiza al ejecutar ARRAY 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 como if, 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.
Última modificación el 2 de julio de 2026