用量
加入: 查看名称 { ... }
}
层次结构
join |
默认值
无接受
现有视图的名称特殊规则
|
定义
借助 join
,您可以定义探索与视图之间的联接关系,以便合并来自多个视图的数据。对任何指定探索项目,您可以根据需要加入任意数量的视图。
回想一下,每个视图都与数据库中的某个表或您在 Looker 中定义的派生表相关联。同样,由于“探索”与视图相关联,因此它还与某种表格相关联。
与探索相关联的表会放入 Looker 生成的 SQL 的 FROM
子句中。与联接的视图相关联的表会被放入 Looker 生成的 SQL 的 JOIN
子句中。
主要联接参数
如需定义探索和视图之间的联接关系(SQL ON
子句),您需要将 join
与其他参数结合使用。
您必须使用 sql_on
或 foreign_key
参数才能建立 SQL ON
子句。
此外,虽然 type
和 relationship
参数并非始终必需,但您仍需要确保使用适当的联接类型和关系。如果默认值 type: left_outer
和 relationship: 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} ;;
}
}
-
然后,如果您只想查看成员事件,则可以创建一个可以设置为 yes
或 no
的维度,如下所示:
dimension: is_member_event {
type: yesno
sql: ${member.id} IS NOT NULL ;;
}
-
这种方法更可取,因为它让用户可以根据需要查看所有事件或仅查看成员事件。您没有通过联接强制用户仅查看成员事件。
如果不使用对称聚合,请避免导致扇出的联接
如果您的数据库方言不支持对称聚合,应避免导致扇出的联接。也就是说,探索和视图之间具有一对多关系的联接通常应避免。正确的做法是,将数据视图中的数据汇总到派生表中,以便与“探索”功能建立一对一的关系,然后将生成的表格联接到“探索”功能中。
帮助中心内 SQL 扇出问题一文进一步解释了这一重要概念。