借助联接,您可以连接不同的视图,以便同时探索多个视图中的数据,并了解数据的不同部分之间的关系。
例如,您的数据库可能包含 order_items、orders 和 users 表。您可以使用联接同时探索所有表中的数据。本页介绍了 LookML 中的联接,包括特定的联接参数和联接模式。
联接以探索为起点
联接在模型文件中定义,用于建立探索与视图之间的关系。联接会将一个或多个视图连接到单个探索,可以直接连接,也可以通过另一个已联接的视图连接。
请考虑以下两个数据库表:order_items 和 orders。为这两个表生成视图后,在模型文件的 explore 参数下声明其中一个或多个视图:
explore: order_items { ... }
当您从 order_items 探索运行查询时,order_items 会显示在生成的 SQL 的 FROM 子句中:
SELECT ...
FROM order_items
您可以将其他信息联接到 order_items 探索。例如,您可以使用以下示例 LookML 将 orders 视图联接到 order_items 探索:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
}
前面显示的 LookML 完成了两项任务。首先,您可以在 探索字段选择器 中看到 orders 和 order_items 中的字段:

其次,LookML 描述了如何将 orders 和 order_items 联接在一起。该 LookML 会转换为以下 SQL:
SELECT ...
FROM order_items
LEFT JOIN orders
ON order_items.order_id = orders.id
以下部分将更详细地介绍这些 LookML 参数。
联接参数
联接使用四个主要参数:join、type、relationship 和 sql_on。
第 1 步:启动探索
首先,创建 order_items 探索:
explore: order_items { ... }
第 2 步:join
如需联接表,您必须先在视图中声明该表。在本示例中,假设 orders 是模型中的现有视图。
然后,使用 join 参数声明您要将 orders 视图联接到 order_items 探索:
explore: order_items {
join: orders { ... }
}
第 3 步:type
考虑要执行的联接类型。Looker 支持 LEFT JOIN、INNER JOIN、FULL OUTER JOIN 和 CROSS JOIN。这些联接类型分别对应于 type 参数值 left_outer、inner、full_outer 和 cross。
explore: order_items {
join: orders {
type: left_outer
}
}
type 的默认值为 left_outer。
第 4 步:relationship
定义 order_items 探索和 orders 视图之间的联接关系。正确声明联接的关系对于 Looker 计算准确的衡量指标非常重要。关系是从 from order_items 探索到 to orders 视图定义的。可能的选项包括 one_to_one、many_to_one、one_to_many 和 many_to_many。
在本示例中,一个订单可以包含多个订单项。从 order_items 探索到 orders 视图的关系为 many_to_one:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
}
}
如果您在联接中未添加 relationship 参数,Looker 会默认使用 many_to_one。
如需了解有关为联接正确定义 relationship 参数的其他提示,请参阅 正确设置 relationship 参数。
第 5 步:sql_on
使用 sql_on 参数或 foreign_key 参数声明如何将 order_items 表和 orders 表联接在一起。
sql_on 参数等同于查询生成的 SQL 中的 ON 子句。借助此参数,您可以声明应匹配哪些字段以执行联接:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
}
您还可以编写更复杂的联接。例如,您可能只想联接 id 大于 1000 的订单:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} AND ${orders.id} > 1000 ;;
}
}
如需详细了解这些示例中的 ${ ... } 语法,请参阅 替换运算符文档。
第 6 步:测试
前往 Order Items 探索,测试此联接是否按预期运行。您应该会看到 order_items 和 orders 中的字段。

如需详细了解如何在探索中测试 LookML 更改,请参阅测试探索中的字段。
通过另一个视图进行联接
您可以通过另一个视图将视图联接到探索。在联接参数示例中,您使用order_id字段将orders联接到order_items。我们可能还想将名为 users 的视图中的数据联接到 order_items 探索,即使它们没有共享的字段也是如此。这可以通过联接 orders 视图来完成。
使用 sql_on 参数或 foreign_key 参数将 users 视图联接到 orders 视图,而不是联接到 order_items 探索。为此,请将 orders 中的字段正确限定为 orders.user_id。
下面是使用 sql_on 参数的示例:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
}
join: users {
type: left_outer
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id} ;;
}
}
多次联接视图
users 视图包含买家 和卖家 的数据。如需将此视图中的数据联接到 order_items,但分别针对买家和卖家执行此操作,您可以使用 users 联接两次,并使用不同的名称,使用 from 参数。
借助 from 参数,您可以指定要在联接中使用哪个视图,同时为联接指定唯一的名称。例如:
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} ;;
}
}
在这种情况下,只有买家 数据会联接为 buyers,而只有卖家 数据会联接为 sellers。
注意:现在必须在联接中使用别名 buyers 和 sellers 来引用 users 视图。
限制联接中的字段
借助 fields 参数,您可以指定将哪些字段从联接引入到探索中。默认情况下,视图中的所有字段在联接时都会引入。不过,您可能只想引入一部分字段。
例如,当 orders 联接到 order_items 时,您可能只想通过联接引入 shipping 和 tax 字段:
explore: order_items {
join: orders {
type: left_outer
relationship: many_to_one
sql_on: ${order_items.order_id} = ${orders.id} ;;
fields: [shipping, tax]
}
}
您还可以引用一组字段,例如 [set_a*]。每个集合都是在视图中使用 set 参数定义的。假设您在 orders 视图中定义了以下集合:
set: orders_set {
fields: [created_date, shipping, tax]
}
当您将 orders 联接到 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*]
}
}
对称聚合
Looker 使用一项名为“对称聚合”的功能来正确计算聚合(例如总和和平均值),即使联接导致扇出也是如此。了解对称聚合中更详细地介绍了对称聚合。SQL 扇出问题社区帖子中介绍了对称聚合解决的扇出问题。
必须提供主键
如需通过联接获取衡量指标(聚合),您必须在联接中涉及的所有视图中定义主键。
为此,请将 primary_key 参数添加到每个视图中的主键字段定义:
dimension: id {
type: number
primary_key: yes
}
支持的 SQL 语言
如需让 Looker 在 Looker 项目中支持对称聚合,您的数据库方言也必须支持对称聚合。下表显示了在最新版 Looker 中哪些方言支持对称聚合:
| 方言 | 是否支持? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
如果您的方言不支持对称聚合,请在 Looker 中执行联接时小心谨慎,因为某些类型的联接可能会导致不准确的聚合(例如总和和平均值)。SQL 扇出问题社区帖子中非常详细地介绍了此问题及其解决方法。
详细了解联接
如需详细了解 LookML 中的联接参数,请参阅联接参考文档。