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.
PostgreSQL
FROM unnest(...), CROSS JOIN UNNEST(...) et LATERAL ne sont pas pris en charge. Utilisez plutôt ARRAY JOIN. Le nom unnest (depuis la version 26.5) est un alias d’appel de fonction de arrayJoin (SELECT unnest(arr)), et non une fonction de table.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 duJOIN.LEFT ARRAY JOIN- Le résultat duJOINcontient 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
ARRAY JOIN et LEFT ARRAY JOIN. Créons une table avec une colonne de type Array et insérons-y des valeurs :
ARRAY JOIN :
LEFT ARRAY JOIN :
ARRAY JOIN et la fonction arrayEnumerate
ARRAY JOIN. Elle permet de ne compter quelque chose qu’une seule fois par tableau après l’application de ARRAY JOIN. Exemple :
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
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).
Utilisation des alias
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 :
ARRAY JOIN avec un tableau externe. Par exemple :
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 :
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 :
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 :
JOIN, soit le tableau source. Exemple :
Détails d’implémentation
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
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.