在 LookML 中使用联接

联接功能可让您关联不同的视图,以便同时探索多个视图中的数据,并了解数据的不同部分之间的关系。

例如,您的数据库可能包含表 order_itemsordersusers。您可以使用联接同时探索所有表中的数据。本页介绍了 LookML 中的联接,包括具体的联接参数和联接模式。

联接从探索开始

联接在模型文件中定义,用于建立探索视图之间的关系。联接用于将一个或多个视图直接或通过其他联接的视图连接到单个探索。

假设有两个数据库表:order_itemsorders。为这两个表生成视图后,在模型文件的 explore 参数下声明其中一个或多个视图:

explore: order_items { ... }

当您从 order_items 探索功能运行查询时,生成的 SQL 的 FROM 子句中会显示 order_items

SELECT ...
FROM order_items

您可以将其他信息加入 order_items 探索。例如,您可以使用以下示例 LookML 将 orders 视图联接到 order_items Explore:

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

前面显示的 LookML 可实现两项功能。首先,您可以在“探索”字段选择器中看到 ordersorder_items 中的字段:

“订购商品数”探索包含“订购商品数”视图中的字段以及联接的“订单”视图中的字段。

其次,LookML 描述了如何将 ordersorder_items 联接在一起。相应 LookML 会转换为以下 SQL:

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

以下各部分将更详细地介绍这些 LookML 参数。

联接参数

用于联接的四个主要参数是:jointyperelationshipsql_on

第 1 步:开始探索

首先,创建 order_items 探索:

explore: order_items { ... }

第 2 步:join

如需联接表,您必须先在视图中声明表。在此示例中,假设 orders 是模型中的现有视图。

然后,使用 join 参数声明您要将 orders 视图联接到 order_items 探索:

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

第 3 步:type

考虑要执行的联接类型。Looker 支持 LEFT JOININNER JOINFULL OUTER JOINCROSS JOIN。这些值分别对应于 type 参数值 left_outerinnerfull_outercross

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

type 的默认值为 left_outer

第 4 步:relationship

定义 order_items 探索与 orders 视图之间的联接关系。正确声明联接的关系对于 Looker 计算准确的度量至关重要。该关系是从 order_items 探索 orders 视图定义的。可能的选项包括 one_to_onemany_to_oneone_to_manymany_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_itemsorders 中的字段。

如需详细了解如何在探索中测试 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 中,但分别针对买方和卖方进行联接,您可以使用 from 参数将 users 联接两次,并使用不同的名称。

借助 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 进行联接。

注意:现在,在联接中必须使用 users 视图的别名 buyerssellers 来引用该视图。

限制联接中的字段

借助 fields 参数,您可以指定将哪些字段从联接中引入到探索中。默认情况下,联接时会引入视图中的所有字段。不过,您可能只想提取一部分字段。

例如,当 ordersorder_items 联接时,您可能只想通过联接引入 shippingtax 字段:

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]
}

ordersorder_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 最新版本中哪些方言支持对称聚合:

方言 是否支持?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
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
Firebolt
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
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 中的联接参数,请参阅联接参考文档。