类型

本页引用了联接中的 type 参数。

type 也可以用作维度的一部分,如维度、过滤条件和参数类型文档页面中所述。

type 也可以用作测量量的一部分,如测量类型文档页面所述。

type 也可以用作信息中心过滤条件的一部分,如信息中心参数文档页面中所述。

type 也可以用作信息中心元素的一部分,如 type(适用于 LookML 信息中心)参数文档页面中所述。

用量

探索:view_name {
join: view_name_2 {
type: inner
}
}
层次结构
type
默认值
left_outer

接受
联接类型(crossfull_outerinnerleft_outer

特殊规则
当您使用 type 以外的 left_outer 时,可能需要使用 always_join 来确保生成的行包含联接限制。

定义

type 用于描述要执行的联接类型。可能的联接类型值会在下一张图片中显示:

可能的联接类型值如本页以下各部分所述:

left_outer(默认值)

Looker 中最常见的联接类型是 left_outer(本页面上的 left_outer 联接类型通常是首选类型部分,介绍了频繁使用联接的原因)。在 SQL 中,您可能以 LEFT JOIN 的形式知道它。使用此 type 时,“探索”功能中的所有行都包含在内,并且会合并来自“合并”视图的数据(如果有)。



full_outer

full_outer 联接类型(在 SQL 中可能知道为 FULL OUTER JOIN)包括“探索”和“联接”视图中的所有行,即使另一个视图中没有相应的数据也是如此。请注意,MySQL 不支持全外联接。



inner

inner 联接类型(在 SQL 中您可能知道它是 JOININNER JOIN)仅包含在“探索”和“合并”视图中都有匹配记录的行。



cross

很少使用 cross 联接类型(您可能知道 SQL 就是 CROSS JOIN)。有时,它适用于零填充或矩阵生成。它会为“探索”和“合并”视图的每个组合创建一行。这个概念很难在维恩图示上展示,不妨通过表格示例更好地理解:

示例

使用 LEFT JOINdna 数据添加到 people 数据(如果有 dna 信息):

explore: person {
  join: dna {
    sql_on: ${person.dna_id} = ${dna.id} ;;
    type: left_outer  # Could be excluded since left_outer is the default
  }
}

使用 FULL OUTER JOIN 向您的 order 数据添加 user 数据(即使用户尚未下单):

explore: order {
  join: user {
    sql_on: ${order.user_id} = ${user.id} ;;
    type: full_outer
  }
}

使用 INNER JOIN 添加 user 数据至您的 event 数据,并将结果限制为仅由用户生成的事件:

explore: event {
  join: user {
    sql_on: ${event.user_id} = ${user.id} ;;
    type: inner
  }
}

使用 CROSS JOIN 生成 ownerproperty 的所有可能组合:

explore: property {
  join: owner {
    sql_on: 1 = 1 ;; # this sql_on condition is required in some dialects,
    type: cross      # but causes problems in other dialects, try adding or
  }                  # removing if you experience problems with cross joins
}

注意事项

通常首选 left_outer 联接类型

在学习和使用 SQL 时,许多人主要关注 JOIN,技术上也称为“内联接”。因此,人们可能会认为在大多数情况下应使用 type: inner_join。不过,Looker 通常最适合与 type: left_outer 搭配使用,就像在 SQL 中使用 LEFT JOIN 一样。

这是因为与探索相关联的数据视图(而不是已加入探索的数据视图)通常是“主要”数据。例如,您可能有基于活动信息的“探索”。某些事件可能是由您的系统生成的,而其他事件可能是由您的用户生成的。如果您使用常规 JOINuser 加入 event,则只能查看用户创建的活动,而且无法查看系统事件。改用 LEFT JOIN 后,您将能够查看所有事件,无论是否存在与之关联的用户。

如果限制行数非常重要,您可能需要使用 always_join

在为查询生成 SQL 时,Looker 会尝试尽可能创建最简洁的 SQL,并且只会使用用户选择的字段所必需的联接。使用 type 定义除 LEFT JOIN 之外的值时,您可能希望特定联接(或一组联接)包含在查询中,以确保生成的行包含联接限制。您可以使用 always_join 参数来实现此目的。