foreign_key

用法

explore: view_name_1 {
  join: view_name_2 {
    foreign_key: dimension_name
  }
}
层次结构
foreign_key
默认值

接受
Looker 维度名称

特殊规则
  • 此字段需要维度名称,而不是底层表中的列名称(尽管有时它们是相同的)
  • foreign_keysql_foreign_keysql_on 不得在同一 join 中同时使用
  • 联接视图中的一个维度必须使用 primary_key 参数定义为视图的主键

定义

foreign_key 用于在视图及其探索之间建立联接关系。Looker 会将 foreign_key 引用的维度与联接视图的主键进行匹配。您可以通过为用作主键的字段启用 primary_key 来设置联接视图的主键。

使用 foreign_key 时,视图可以直接联接到探索,也可以通过已联接到相应探索的第二个视图进行联接。

第一种情况(视图直接联接到探索)的示例如下所示:

explore: order {
  join: customer {
    foreign_key: customer_id
  }
}

假设 customer 的主键名为 id,则 Looker 生成的 SQL 将为:

SELECT    ...
FROM      order
LEFT JOIN customer
ON        order.customer_id = customer.id

在第二种情况下,视图通过已与探索联接的中间视图与探索联接。例如:

explore: order_items {
  join: order {
    foreign_key: order_id
  }
  join: customer {
    foreign_key: order.customer_id
  }
}

在此示例中,customer 无法直接与 order_items 联接。而是必须通过 order 进行联接。假设 ordercustomer 的主键都命名为 id,则 Looker 生成的 SQL 将如下所示:

SELECT    ...
FROM      order_items
LEFT JOIN order
ON        order_items.order_id = order.id
LEFT JOIN customer
ON        order.customer_id = customer.id

为了使此操作正常运行,您可以看到,我们在联接 customer 时使用了完全限定的字段引用 order.customer_id,而不是简单的 customer_id。如果我们只使用 customer_id,Looker 会尝试直接将 customer 连接到 order_items.customer_id,而不是通过 order.customer_id 进行连接。

示例

通过将视图 customer 中的主键与探索 order 中的 order.customer_id 相匹配,将视图 customer 与探索 order 联接起来:

explore: order {
  join: customer {
    foreign_key: customer_id
  }
}

通过名为 order 的视图,将名为 customer 的视图与名为 order_items 的探索相关联。将 customer 中的主键与 order.customer_id 中的主键相匹配,并将 order 中的主键与 order_items.order_id 中的主键相匹配:

explore: order_items {
  join: order {
    foreign_key: order_id
  }
  join: customer {
    foreign_key: order.customer_id
  }
}

将名为 orderinventory_item 的视图与名为 order_items 的探索联接。将 order 中的主键与 order_items.order_id 中的主键相匹配,并将 inventory_item 中的主键与 order_items.inventory_id 中的主键相匹配:

explore: order_items {
  join: order {
    foreign_key: order_id
  }
  join: inventory_item {
    foreign_key: inventory_id
  }
}

常见挑战

foreign_key 必须引用维度名称,而不是列名称

foreign_key 参数仅接受维度名称,而不接受底层 SQL 数据库中的列名称。通常情况下,维度名称和列名称是相同的,这可能会导致错误地认为可以使用列名称。

在与 foreign_key 联接的视图中必须定义主键

为了使 foreign_key 正常运行,联接视图中的一个维度必须定义为该视图的主键。主键通过 primary_key 参数定义。

由于只能将一个维度定义为主键,因此您无法将 foreign_key 与具有多列主键的视图搭配使用。在这种情况下,您需要改用 sql_on

注意事项

foreign_key 并不是在 Looker 中进行联接的唯一方式

某些联接关系无法通过 foreign_key 建立。例如,联接可能不使用联接视图的主键,或者可能要求多个条件是联接的一部分。在这些情况下,请改用 sql_on