联接

用量

探索:探索名称 {
加入: 查看名称 { ... }
}
层次结构
join
默认值


接受
现有视图的名称

特殊规则
  • 此参数接受视图名称,而不是视图底层表的名称(尽管它们通常完全相同)
  • 如果您的方言不支持 symmetric_aggregates,则在合并后的视图中会排除大多数衡量类型
  • 您可以使用 from 多次加入同一视图

定义

借助 join,您可以定义探索视图之间的联接关系,以便合并来自多个视图的数据。对任何指定探索项目,您可以根据需要加入任意数量的视图。

回想一下,每个视图都与数据库中的某个表或您在 Looker 中定义的派生表相关联。同样,由于“探索”与视图相关联,因此它还与某种表格相关联。

与探索相关联的表会放入 Looker 生成的 SQL 的 FROM 子句中。与联接的视图相关联的表会被放入 Looker 生成的 SQL 的 JOIN 子句中。

主要联接参数

如需定义探索和视图之间的联接关系(SQL ON 子句),您需要将 join 与其他参数结合使用。

您必须使用 sql_on foreign_key 参数才能建立 SQL ON 子句

此外,虽然 typerelationship 参数并非始终必需,但您仍需要确保使用适当的联接类型和关系。如果默认值 type: left_outerrelationship: many_to_one 适合您的使用场景,则可以排除这些参数。

下面显示了这些关键参数及其与 Looker 生成的 SQL 的关系:

sql_on

借助 sql_on,您可以通过直接编写 SQL ON 子句来建立联接关系。它可以实现与 foreign_key 相同的联接,但更易于理解和理解。

如需了解详情,请参阅 sql_on 参数文档页面。

foreign_key

借助 foreign_key,您可以使用“合并”视图的主键建立探索关系,并将其与“探索”中的某个维度相关联。此模式在数据库设计中很常见,在这些情况下,foreign_key 是一种表达联接的优雅方式。

如需全面了解相关信息,请参阅 foreign_key 参数文档页面。

type

Looker 中的大多数联接都为 LEFT JOIN,原因请参阅本页中的请勿在联接中应用业务逻辑部分。因此,如果您未明确添加 type,Looker 会假设您需要 LEFT JOIN。不过,如果您出于某种原因确实需要其他类型的联接,可以使用 type 来实现。

如需了解完整说明,请参阅 type 参数文档页面。

relationship

在上图中,relationship 对 Looker 生成的 SQL 没有直接影响,但对于 Looker 的正常运行至关重要。如果您未明确添加 relationship,Looker 会假定它是 many-to-one,也就是说,探索中的许多行都可以在联接视图中有一行。并非所有联接都具有这种关系,并且需要正确声明与其他关系的联接。

如需全面了解相关信息,请参阅 relationship 参数文档页面。

示例

将名为 customer 的视图与名为 order 的探索相关联,其中联接关系是

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

explore: order {
  join: customer {
    foreign_key: customer_id
    relationship: many_to_one # Could be excluded since many_to_one is the default
    type: left_outer          # Could be excluded since left_outer is the default
  }
}

-

将名为 address 的视图与名为 person 的探索相关联,其中联接关系是

FROM person LEFT JOIN address ON person.id = address.person_id AND address.type = 'permanent'

explore: person {
  join: address {
    sql_on: ${person.id} = ${address.person_id} AND ${address.type} = 'permanent' ;;
    relationship: one_to_many
    type: left_outer # Could be excluded since left_outer is the default
  }
}

-

将名为 member 的视图与名为 event 的探索相关联,其中联接关系是

FROM event INNER JOIN member ON member.id = event.member_id

explore: event {
  join: member {
    sql_on: ${event.member_id} = ${member.id} ;;
    relationship: many_to_one # Could be excluded since many_to_one is the default
    type: inner
  }
}

-

常见挑战

join 必须使用视图名称,而不是底层表名称

join 参数只接受一个视图名称,而不是与该视图关联的表名称。视图名称和表名称通常是相同的,这样可能会得出错误的结论,即表名称可以使用。

某些类型的测量需要对称聚合

如果不使用对称聚合,大多数测量类型会从联接视图中排除。为了让 Looker 支持您的 Looker 项目中的对称聚合,您的数据库方言也必须支持它们。下表显示了最新版 Looker 中的哪些方言支持对称聚合:

如果没有对称聚合,连接并非一对一关系可能会在聚合函数中创建不准确的结果。由于 Looker 衡量是聚合函数,因此只有 type: count 作为衡量(从 COUNT DISTINCT 中引入)才会被纳入“探索”。如果您确实有一对一联接关系,则可以使用 relationship 参数强制添加其他测量类型,如下所示:

explore: person {
  join: dna {
    sql_on: ${person.dna_id} = ${dna.id} ;;
    relationship: one_to_one
  }
}

Looker 以这种方式工作的原因(适用于不支持对称聚合的方言)这篇有关 SQL 扇出的问题帮助中心文章。

注意事项

您可以使用 from 多次联接同一个表格

如果一个表包含不同类型的实体,则可以将某个视图与“探索”关联多次。为此,您需要使用 from 参数。假设您有一次“order”探索,需要将其加入 person 次浏览:一次代表客户,一次代表客户服务代表。您可以进行如下操作:

explore: order {
  join: customer {
    from: person
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
  join: representative {
    from: person
    sql_on: ${order.representative_id} = ${representative.id} ;;
  }
}

请勿在联接中应用业务逻辑

标准的 Looker 加入方法是尽可能使用 LEFT JOIN。如果您发现自己有以下行为,不妨考虑采用不同的方法:

explore: member_event {
  from: event
  always_join: [member]
  join: member {
    sql_on: ${member_event.member_id} = ${member.id} ;;
    type: inner
  }
}

-

在此示例中,我们创建了“探索”,它仅查看与已知成员相关联的事件。不过,在 Looker 中执行该操作的首选方法是使用 LEFT JOIN 将事件数据和成员数据绑定在一起,如下所示:

explore: event {
  join: member {
    sql_on: ${event.member_id} = ${member.id} ;;
  }
}

-

然后,如果您只想查看成员事件,则可以创建一个可以设置为 yesno 的维度,如下所示:

dimension: is_member_event {
  type: yesno
  sql: ${member.id} IS NOT NULL ;;
}

-

这种方法更可取,因为它让用户可以根据需要查看所有事件或仅查看成员事件。您没有通过联接强制用户仅查看成员事件。

如果不使用对称聚合,请避免导致扇出的联接

本部分仅适用于不支持对称聚合的数据库方言。请参阅本页面常见挑战部分中的讨论对称聚合,以确定您的方言是否支持对称聚合。

如果您的数据库方言不支持对称聚合,应避免导致扇出的联接。也就是说,探索和视图之间具有一对多关系的联接通常应避免。正确的做法是,将数据视图中的数据汇总到派生表中,以便与“探索”功能建立一对一的关系,然后将生成的表格联接到“探索”功能中。

帮助中心内 SQL 扇出问题一文进一步解释了这一重要概念。