Utilisation de jointures dans LookML

Les jointures vous permettent de relier différentes vues. Vous pouvez ainsi explorer des données à partir de plusieurs vues à la fois et voir comment les différentes parties de vos données sont liées.

Par exemple, votre base de données peut inclure les tables order_items, orders et users. Il est possible d'utiliser des jointures pour explorer simultanément les données de toutes les tables. Cette page explique comment utiliser la fonction de jointure de LookML, notamment ses paramètres spécifiques et ses modèles de jointure.

Les jointures commencent par une exploration

Les jointures sont définies dans le fichier de modèle pour établir la relation entre une exploration et une vue. Elles relient une ou plusieurs vues d'une exploration, directement ou par le biais d'une autre vue jointe.

Prenons l'exemple de deux tables de base de données: order_items et orders. Après avoir généré des vues pour les deux tables, déclarez une ou plusieurs d'entre elles sous le paramètre explore dans le fichier de modèle:

explore: order_items { ... }

Lorsque vous exécutez une requête depuis la fonction order_items Explorer, order_items apparaît dans la clause FROM du code SQL généré:

SELECT ...
FROM order_items

Vous pouvez rejoindre notre order_items Explorer. Par exemple, pour ajouter des données sur le order dont fait partie order_item, vous pouvez procéder comme suit:

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} &#59;&#59;
  }
}

Le code LookML ci-dessus a deux fonctions. Tout d'abord, l'interface utilisateur affiche les champs des champs orders et order_items:

Deuxièmement, le LookML explique comment joindre orders et order_items. Converti en SQL, ce code LookML se présenterait comme suit :

SELECT ...
FROM order_items
LEFT JOIN orders
ON order_items.order_id = orders.id

Ces paramètres LookML sont décrits plus en détail dans les sections suivantes. Consultez la page de référence des paramètres join pour en savoir plus sur la traduction de ce LookML en SQL.

Conseil de l'équipe Chat : les utilisateurs posent la plupart des questions sur l'erreur de validation, le champ "Inconnu ou inaccessible", ce qui peut être dû à une jointure manquante. Pour en savoir plus, consultez cet article du Centre d'aide.

Paramètres de jointure

Quatre principaux paramètres sont utilisés : joins, join, type, relationship et sql_on.

Étape n° 1 : Début de l'exploration

Commencez par créer la section order_items Explorer:

explore: order_items { ... }

Étape 2 : join

Pour joindre une table, vous devez tout d'abord la déclarer dans une vue. Dans cet exemple, orders est une vue existante de notre modèle.

Ensuite, utilisez le paramètre join pour déclarer que vous souhaitez joindre la vue orders à order_items:

explore: order_items {
  join: orders { ... }
}

Étape 3: type

Réfléchissez à la type de jointure à effectuer. Looker est compatible avec LEFT JOIN, INNER JOIN, FULL OUTER JOIN et CROSS JOIN. Elles correspondent aux valeurs des paramètres type de left_outer, inner, full_outer et cross.

explore: order_items {
  join: orders {
    type: left_outer
  }
}

La valeur par défaut de type est left_outer, et correspond généralement au type de jointure le plus courant.

Étape 4 : relationship

Définissez une jointure relationship entre order_items et orders. Il est important de déclarer correctement les relationship d'une jointure pour que Looker puisse calculer des mesures précises. La relation est définie de la order_items Explorer à la vue orders. Les options possibles sont one_to_one, many_to_one, one_to_many et many_to_many.

Dans cet exemple, il peut y avoir plusieurs order_items pour un seul order. La relation entre order_items et orders est many_to_one :

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
  }
}

Si vous n'incluez pas de relationship dans votre jointure, Looker est défini par défaut sur many_to_one.

Pour obtenir des conseils supplémentaires sur la définition correcte du paramètre relationship pour une jointure, consultez l'article Utiliser le paramètre relationship correctement.

Étape 5: sql_on

Déclarez comment joindre ces deux tables avec le paramètre sql_on ou foreign_key. Nous recommandons généralement sql_on, car il offre les mêmes possibilités que foreign_key, mais il est généralement plus facile à comprendre.

sql_on équivaut à la clause ON dans le code SQL généré pour une requête. Avec ce paramètre, vous pouvez désigner les champs à rapprocher pour effectuer la jointure :

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} &#59;&#59;
  }
}

Vous pouvez également écrire des jointures plus complexes. Par exemple, vous pouvez choisir de ne joindre que les campagnes dont la valeur id est supérieure à 1 000:

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} AND ${orders.id} > 1000 &#59;&#59;
  }
}

Consultez les opérateurs de substitution pour en savoir plus sur la syntaxe ${ ... } dans ces exemples.

Étape n° 6 : Test

Vérifiez que cette jointure fonctionne comme prévu en accédant à l'onglet Explorer les articles. Vous devriez voir des champs de order_items et de orders.

Pour en savoir plus sur le test des modifications de LookML, consultez la section Développement de modèles.

Jointure via une autre vue

Vous pouvez joindre une vue à une exploration par le biais d'une autre vue. Dans l'exemple ci-dessus, vous avez joint orders à order_items via le champ order_id. Nous souhaitons également joindre les données d'une vue appelée users à la fonction order_items Explorer, même s'ils ne partagent pas de champ commun. Pour ce faire, connectez-vous via la vue orders.

Utilisez sql_on ou foreign_key pour joindre users à orders au lieu de order_items. Pour ce faire, définissez correctement le champ orders pour orders.user_id.

Voici un exemple utilisant sql_on:

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} &#59;&#59;
  }
  join: users {
    type: left_outer
    relationship: many_to_one
    sql_on: ${orders.user_id} = ${users.id} &#59;&#59;
  }
}

Jointures multiples d'une vue

Une vue users contient des données pour les acheteurs et les vendeurs. Pour associer les données de cette vue à order_items, mais séparément pour les acheteurs et les vendeurs, vous pouvez associer users deux fois, avec des noms différents, à l'aide du paramètre from.

Le paramètre from vous permet de spécifier la vue à utiliser dans une jointure, tout en lui donnant un nom unique. Exemple :

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
  }
  join: buyers {
    from: users
    type: left_outer
    relationship: many_to_one
    sql_on: ${orders.buyer_id} = ${buyers.id} ;;
  }
  join: sellers {
    from: users
    type: left_outer
    relationship: many_to_one
    sql_on: ${orders.seller_id} = ${sellers.id} ;;
  }
}

Dans ce cas, seules les données des acheteurs sont associées sous la forme buyers, tandis que seules les données des vendeurs sont associées sous la forme sellers.

Remarque : La vue users doit maintenant être désignée par les alias buyers et sellers de la jointure.

Limitation des champs d'une jointure

Le paramètre fields vous permet de spécifier les champs importés d'une jointure dans une exploration. Par défaut, en cas de jointure, tous les champs d'une vue sont pris en compte. Il arrive toutefois qu'un sous-ensemble de champs soit suffisant.

Par exemple, lorsque orders est joint à order_items, vous pouvez utiliser uniquement les champs shipping et tax via la jointure:

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
    fields: [shipping, tax]
  }
}

Vous pouvez également référencer un ensemble de champs, par exemple [set_a*]. Chaque ensemble est défini dans une vue à l'aide du paramètre set. Supposons que l'ensemble suivant soit défini dans la vue orders:

set: orders_set {
  fields: [created_date, shipping, tax]
}

Vous pouvez choisir de n'afficher que ces trois champs lorsque vous rejoignez orders dans order_items:

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
    fields: [orders_set*]
  }
}

Agrégations symétriques

Looker utilise une fonction appelée "agrégats symétriques" pour calculer correctement les agrégations (comme les sommes et les moyennes), même lorsque les jointures entraînent une distribution ramifiée. Les agrégations symétriques sont décrites plus en détail dans l'article du centre d'aide intitulé Une explication simple des agrégations symétriques, et le problème qu'elles résolvent est expliqué dans l'article The problème of SQL fanouts (Le problème des distributions SQL).

Clés primaires requises

Pour que les mesures (agrégations) soient conservées dans une jointure, vous devez définir des clés primaires dans toutes les vues impliquées dans la jointure.

Pour ce faire, ajoutez le paramètre primary_key à la définition du champ de clé primaire dans chaque vue:

dimension: id {
  type: number
  primary_key: yes
}

Pour traiter correctement les mesures jointes, Looker compte su vous pour définir une clé primaire avec des valeurs non NULLES parfaitement uniques. Si vos données ne contiennent pas de clé primaire, déterminez si la concaténation de plusieurs champs générerait une clé primaire de valeurs complètement uniques et non nulles. Si votre clé primaire n'est pas unique ou contient des valeurs NULL et que votre requête inclut des données révélant ces problèmes, Looker renvoie une erreur, comme décrit dans cet article du Centre d'aide.

Dialectes SQL pris en charge

Pour que Looker prenne en charge les agrégations symétriques dans votre projet, votre dialecte de base de données doit également les prendre en charge. Le tableau suivant indique les dialectes compatibles avec les agrégations symétriques dans la dernière version de Looker:

Si votre dialecte ne reconnaît pas les agrégations symétriques, soyez attentif lors de l'exécution de jointures dans Looker, car certains types de jointures peuvent se solder par des agrégations (sommes, moyennes, etc.) inexactes. Ce problème et les solutions de contournement sont décrits en détail dans l'article du centre d'aide intitulé Le problème des distributions SQL.

En savoir plus sur les jointures

Pour en savoir plus sur les paramètres de jointure dans LookML, consultez la documentation de référence sur les jointures.