Utilisation
explore: view_name_1 {
join: view_name_2 {
foreign_key: dimension_name
}
}
|
Hiérarchie
foreign_key |
Valeur par défaut
Aucun
Acceptation
Nom d'une dimension Looker
Règles spéciales
|
Définition
foreign_key établit une relation de jointure entre une vue et son exploration. Looker fait correspondre la dimension référencée par foreign_key à la clé primaire de la vue jointe. Vous définissez la clé primaire de la vue jointe en activant primary_key pour le champ qui sert de clé primaire.
Une vue peut être jointe directement à une exploration lorsque vous utilisez foreign_key, ou elle peut être jointe par le biais d'une deuxième vue déjà jointe à cette exploration.
Voici un exemple du premier cas, où une vue est jointe directement à l'exploration :
explore: order {
join: customer {
foreign_key: customer_id
}
}
En supposant que la clé primaire de customer ait été nommée id, le code SQL généré par Looker serait le suivant :
SELECT ...
FROM order
LEFT JOIN customer
ON order.customer_id = customer.id
Dans le second cas, une vue est jointe à une exploration par le biais d'une vue intermédiaire déjà jointe à cette exploration. Par exemple :
explore: order_items {
join: order {
foreign_key: order_id
}
join: customer {
foreign_key: order.customer_id
}
}
Ici, customer ne peut pas être joint directement à order_items. Il doit plutôt être joint via order. En supposant que les clés primaires de order et customer aient été nommées id, le code SQL généré par Looker serait le suivant :
SELECT ...
FROM order_items
LEFT JOIN order
ON order_items.order_id = order.id
LEFT JOIN customer
ON order.customer_id = customer.id
Pour que cela fonctionne correctement, vous pouvez voir que nous avons utilisé la référence de champ à portée complète order.customer_id lors de la jointure de customer, au lieu de simplement customer_id. Si nous n'avions utilisé que customer_id, Looker aurait essayé de joindre customer directement à order_items.customer_id au lieu de passer par order.customer_id.
Exemples
Joignez la vue nommée customer à l'exploration nommée order en faisant correspondre la clé primaire de customer à order.customer_id :
explore: order {
join: customer {
foreign_key: customer_id
}
}
Joignez la vue nommée customer à l'exploration nommée order_items via la vue appelée order. Faites correspondre la clé primaire de customer avec order.customer_id, et la clé primaire de order avec order_items.order_id :
explore: order_items {
join: order {
foreign_key: order_id
}
join: customer {
foreign_key: order.customer_id
}
}
Joignez les vues nommées order et inventory_item à l'exploration nommée order_items. Faites correspondre la clé primaire de order avec order_items.order_id, et la clé primaire de inventory_item avec order_items.inventory_id :
explore: order_items {
join: order {
foreign_key: order_id
}
join: inventory_item {
foreign_key: inventory_id
}
}
Difficultés courantes
foreign_key doit faire référence à un nom de dimension, et non à un nom de colonne.
Le paramètre foreign_key n'accepte qu'un nom de dimension, et non le nom de la colonne dans votre base de données SQL sous-jacente. Souvent, le nom de la dimension et celui de la colonne sont identiques, ce qui peut conduire à la conclusion erronée que les noms de colonnes peuvent être utilisés.
Une clé primaire doit être définie dans les vues jointes avec foreign_key.
Pour que foreign_key fonctionne correctement, l'une des dimensions de la vue jointe doit être définie comme clé primaire de cette vue. Une clé primaire est définie à l'aide du paramètre primary_key.
Étant donné qu'une seule dimension peut être définie comme clé primaire, vous ne pouvez pas utiliser foreign_key avec les vues qui comportent une clé primaire à plusieurs colonnes. Dans ce cas, vous devrez utiliser sql_on à la place.
Bon à savoir
foreign_key n'est pas la seule façon de joindre des tables dans Looker.
Il est impossible d'établir certaines relations de jointure avec foreign_key. Par exemple, il est possible que la jointure n'utilise pas la clé primaire de la vue jointe ou qu'elle nécessite plusieurs conditions. Dans ce cas, utilisez plutôt sql_on.