map).
Les fonctions d’agrégation compressent un ensemble de lignes (fold ou reduce).
La fonction arrayJoin prend chaque ligne et génère un ensemble de lignes (unfold).
Cette fonction prend un tableau comme argument et duplique la ligne source en plusieurs lignes, selon le nombre d’éléments du tableau.
Toutes les valeurs des colonnes sont simplement copiées, à l’exception de celles de la colonne à laquelle cette fonction est appliquée, qui sont remplacées par la valeur correspondante du tableau.
Si le tableau est vide,
arrayJoin ne produit aucune ligne.
Pour renvoyer une seule ligne contenant la valeur par défaut du type de tableau, vous pouvez l’imbriquer dans emptyArrayToSingle, par exemple : arrayJoin(emptyArrayToSingle(...)).Query
Response
arrayJoin affecte toutes les parties de la requête, y compris la section WHERE. Notez que le résultat de la requête ci-dessous est 2, même si la sous-requête a renvoyé 1 ligne.
Query
Response
arrayJoin, y compris par l’intermédiaire de son alias unnest, n’est pas autorisé dans une condition JOIN ON évaluée pendant la jointure, car une telle condition doit préserver le nombre de lignes et est évaluée séparément pour chaque lot de lignes jointes. Une condition qui ne s’applique qu’à un seul côté, ainsi qu’une clé d’égalité portant sur arrayJoin, sont extraites avant la jointure et ne sont pas affectées. Une condition ALL INNER JOIN non disjonctive n’est pas non plus affectée, car elle est alors appliquée après la jointure. Lorsque l’expansion ne dépend que d’un seul côté, déplacez-la dans un ARRAY JOIN d’une sous-requête avant la jointure ; une condition dont l’argument arrayJoin lit des colonnes des deux côtés doit être restructurée.
Une requête peut utiliser plusieurs fonctions arrayJoin. Dans ce cas, la transformation est effectuée plusieurs fois et le nombre de lignes est multiplié.
Par exemple :
Query
Response
Bonne pratique
arrayJoin avec la même expression peut ne pas produire les résultats attendus en raison de l’élimination des sous-expressions communes.
Dans ce cas, envisagez de modifier les expressions de tableau répétées en leur appliquant des opérations supplémentaires qui n’affectent pas le résultat du JOIN. Par exemple, arrayJoin(arraySort(arr)), arrayJoin(arrayConcat(arr, []))
Exemple :
Query
ARRAY JOIN dans la requête SELECT, qui offre des possibilités plus étendues.
ARRAY JOIN permet de convertir simultanément plusieurs tableaux comportant le même nombre d’éléments.
Exemple :
Query
Response
Tuple
Exemple :
Query
Row
arrayJoin dans ClickHouse tire son origine de sa parenté conceptuelle avec l’opération JOIN, mais appliquée à des tableaux au sein d’une même ligne. Alors que les JOIN traditionnels combinent des lignes provenant de différentes tables, arrayJoin “associe” chaque élément d’un tableau à une ligne, produisant ainsi plusieurs lignes — une pour chaque élément du tableau — tout en dupliquant les valeurs des autres colonnes. ClickHouse fournit également la syntaxe de clause ARRAY JOIN, ce qui rend ce lien avec les opérations JOIN traditionnelles encore plus explicite en utilisant une terminologie SQL JOIN familière. Ce processus est aussi appelé le “dépliage” du tableau, mais le terme “join” est utilisé à la fois dans le nom de la fonction et dans la clause, car il s’apparente à une jointure entre la table et les éléments du tableau, ce qui étend effectivement le jeu de données d’une manière comparable à une opération JOIN.