Pour les tables qui contiennent une colonne de type Array, il est courant de produire une nouvelle table comportant une ligne pour chaque élément du tableau de cette colonne initiale, tandis que les valeurs des autres colonnes sont dupliquées. Il s’agit du cas de base de ce que fait la clause ARRAY JOIN.
Son nom vient du fait qu’on peut la considérer comme l’exécution d’un JOIN avec un tableau ou une structure de données imbriquée. L’objectif est similaire à celui de la fonction arrayJoin, mais la fonctionnalité de la clause est plus large.
Syntaxe :
Les types de ARRAY JOIN pris en charge sont listés ci-dessous :
ARRAY JOIN - Dans le cas de base, les tableaux vides ne sont pas inclus dans le résultat du JOIN.
LEFT ARRAY JOIN - Le résultat du JOIN contient des lignes avec des tableaux vides. La valeur d’un tableau vide est définie sur la valeur par défaut du type d’élément du tableau (généralement 0, une chaîne vide ou NULL).
Exemples de base d’ARRAY JOIN
ARRAY JOIN et LEFT ARRAY JOIN
Les exemples ci-dessous illustrent l’utilisation des clauses ARRAY JOIN et LEFT ARRAY JOIN. Créons une table avec une colonne de type Array et insérons-y des valeurs :
L’exemple ci-dessous utilise la clause ARRAY JOIN :
L’exemple suivant utilise la clause LEFT ARRAY JOIN :
ARRAY JOIN et la fonction arrayEnumerate
Cette fonction est généralement utilisée avec ARRAY JOIN. Elle permet de ne compter quelque chose qu’une seule fois par tableau après l’application de ARRAY JOIN. Exemple :
Dans cet exemple, Reaches correspond au nombre de conversions (les chaînes obtenues après application de ARRAY JOIN), et Hits au nombre de pages vues (les chaînes avant ARRAY JOIN). Dans ce cas précis, vous pouvez obtenir le même résultat plus simplement :
ARRAY JOIN et arrayEnumerateUniq
Cette fonction est utile lorsque l’on utilise ARRAY JOIN et que l’on agrège des éléments de tableau.
Dans cet exemple, pour chaque ID d’objectif, on calcule le nombre de conversions (chaque élément de la structure de données imbriquée Goals est un objectif atteint, que nous appelons une conversion) ainsi que le nombre de sessions. Sans ARRAY JOIN, nous aurions compté le nombre de sessions avec sum(Sign). Mais dans ce cas précis, les lignes ont été multipliées par la structure imbriquée Goals ; afin de ne compter chaque session qu’une seule fois ensuite, nous appliquons une condition à la valeur de la fonction arrayEnumerateUniq(Goals.ID).
Un alias peut être défini pour un tableau dans la clause ARRAY JOIN. Dans ce cas, on peut accéder à un élément du tableau via cet alias, tandis que le tableau lui-même reste accessible par son nom d’origine. Exemple :
À l’aide d’alias, vous pouvez effectuer ARRAY JOIN avec un tableau externe. Par exemple :
Plusieurs tableaux peuvent être séparés par des virgules dans la clause ARRAY JOIN. Dans ce cas, JOIN leur est appliqué simultanément (somme directe, et non produit cartésien). Notez que, par défaut, tous les tableaux doivent avoir la même taille. Exemple :
L’exemple ci-dessous utilise la fonction arrayEnumerate :
Plusieurs tableaux de tailles différentes peuvent être joints à l’aide de : SETTINGS enable_unaligned_array_join = 1. Exemple :
ARRAY JOIN avec une structure de données imbriquée
ARRAY JOIN fonctionne également avec les structures de données imbriquées :
Lorsque vous spécifiez les noms de structures de données imbriquées dans ARRAY JOIN, cela a le même sens qu’un ARRAY JOIN appliqué à tous les éléments de tableau qui la composent. Des exemples sont présentés ci-dessous :
Cette variante est également valable :
Un alias peut être utilisé pour une structure de données imbriquée afin de sélectionner soit le résultat du JOIN, soit le tableau source. Exemple :
Exemple d’utilisation de la fonction arrayEnumerate :
L’ordre d’exécution des requêtes est optimisé lors de l’utilisation de ARRAY JOIN. Bien que ARRAY JOIN doive toujours être spécifié avant la clause WHERE/PREWHERE dans une requête, leur exécution peut techniquement se faire dans n’importe quel ordre, sauf si le résultat de ARRAY JOIN est utilisé pour le filtrage. L’ordre de traitement est contrôlé par l’optimiseur de requêtes.
Incompatibilité avec l’évaluation court-circuitée des fonctions
L’évaluation court-circuitée des fonctions est une fonctionnalité qui optimise l’exécution d’expressions complexes dans certaines fonctions telles que if, multiIf, and et or. Elle évite que des exceptions potentielles, comme une division par zéro, ne surviennent lors de l’exécution de ces fonctions.
arrayJoin est toujours exécutée et n’est pas compatible avec l’évaluation court-circuitée des fonctions. Cela s’explique par le fait qu’il s’agit d’une fonction particulière, traitée séparément de toutes les autres fonctions lors de l’analyse et de l’exécution de la requête, et qu’elle nécessite une logique supplémentaire incompatible avec l’exécution court-circuitée des fonctions. En effet, le nombre de lignes dans le résultat dépend du résultat de arrayJoin, et il est trop complexe et coûteux d’implémenter une exécution paresseuse de arrayJoin.
Dernière modification le 25 juin 2026