sql_on

用法

explore: view_name_1 {
  join: view_name_2 {
    sql_on: ${view_name_1.id} = ${view_name_2.id} ;;
  }
}
层次结构
sql_on
默认值

接受
SQL ON 子句

特殊规则
sql_onsql_foreign_keyforeign_key 不得在同一 join 中同时使用

定义

sql_on 根据您提供的 SQL ON 子句,在视图及其探索之间建立联接关系。

对于 LookML,sql_on 中条件的顺序无关紧要。因此,sql_on: ${order.user_id} = ${user.id} ;;sql_on: ${user.id} = ${order.user_id} ;; 是等效的。您可以按任意顺序放置条件,除非该顺序与数据库的 SQL 方言相关。

使用 sql_on 时,视图可以直接联接到探索,也可以通过已联接到相应探索的第二个视图进行联接。

第一种情况(视图直接联接到探索)的示例如下所示:

explore: order {
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

Looker 将根据此 LookML 生成的 SQL 如下所示:

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

在第二种情况下,视图通过已与探索联接的中间视图与探索联接。例如:

explore: order_items {
  join: order {
    sql_on: ${order_items.order_id} = ${order.id} ;;
  }
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

此处 customer 无法直接与 order_items 联接。而是必须通过 order 加入。Looker 将根据此 LookML 生成的 SQL 如下所示:

SELECT    ...
FROM      order_items
LEFT JOIN order
ON        order_items.order_id = order.id
LEFT JOIN customer
ON        order.customer_id = customer.id

为了让此功能正常运行,您只需在字段引用中使用正确的视图名称即可。由于 customer 需要联接到 order 中的某个字段,因此我们引用 ${order.customer_id}

在某些旧版模型中,您可能会看到使用 view_name.native_column_name 语法引用的字段。虽然这种方法仍然有效,但改用 ${view_name.looker_dimension_name} 语法有一个重要优势:您可以避免使用 required_joins 参数。本页面的无法使用 ${view_name.looker_dimension_name} 语法时使用 required_joins 部分更详细地介绍了这一概念。

条件联接

您还可以允许在 sql_on 中使用用户输入。虽然您可能出于各种原因想要这样做,但优化 MPP 数据库(例如 Redshift)的查询速度是一个主要用例,如联接子句中的条件社区帖子中所述。

如需将用户输入内容添加到联接条件中,您首先需要为用户输入内容创建过滤条件。我们的模板化过滤条件页面更详细地介绍了这些类型的过滤条件。其基本形式为:

view: view_name {
  filter: filter_name {
    type: number | datetime | date | string
  }
}

添加用于收集用户输入的过滤条件后,您可以在 sql_on 参数中使用该过滤条件,如下所示:

{% condition view_name.filter_name %} view_name.dimension_name {% endcondition %}

例如:

explore: order {
  join: customer {
    sql_on:
      ${order.customer_id} = ${customer.id} AND
      {% condition customer.creation_date_filter %} customer.created_at {% endcondition %} ;;
  }
}

这将被解读为:将 customer.created_at 设置为 customer.creation_date_filter 中的值。

使用 _in_query_is_selected_is_filtered Liquid 变量

sql_on 参数搭配使用时,_in_query_is_selected_is_filtered Liquid 变量非常有用。它们可让您根据用户为查询选择的字段修改联接关系。例如:

explore: dates {
  join: dynamic_order_counts {
    sql_on:
      ${dynamic_order_counts.period} =
      {% if dates.reporting_date._in_query %}
        ${dates.date_string}
      {% elsif dates.reporting_week._in_query %}
        ${dates.week_string}
      {% else %}
        ${dates.month_string}
      {% endif %} ;;
  }
}

示例

通过将 order 中的 customer_id 维度与 customer 中的 id 维度进行匹配,将名为 customer 的视图联接到名为 order 的探索:

explore: order {
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

通过名为 order 的视图,将名为 customer 的视图联接到名为 order_items 的探索中。将 order 中的 customer_id 维度与 customer 中的 id 维度相匹配。将 order_items 中的 order_id 维度与 order 中的 id 维度相匹配。这可以指定为:

explore: order_items {
  join: order {
    sql_on: ${order_items.order_id} = ${order.id} ;;
  }
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

将名为 orderinventory_items 的视图与名为 order_items 的探索联接。将 order_items 中的 inventory_id 维度与 inventory_item 中的 id 维度相匹配。将 order_items 中的 order_id 维度与 order 中的 id 维度相匹配。这可以指定为:

explore: order_items {
  join: order {
    sql_on: ${order_items.order_id} = ${order.id} ;;
  }
  join: inventory_item {
    sql_on: ${order_items.inventory_id} = ${inventory_item.id} ;;
  }
}

注意事项

在无法使用 ${view_name.looker_dimension_name} 语法时使用 required_joins

当您使用 ${view_name.looker_dimension_name} 语法在 sql_on 中引用字段时,无需担心使用 required_joins

不过,部分旧型号仍使用 view_name.native_column_name 语法。在某些情况下,您也无法使用 ${view_name.looker_dimension_name} 语法,例如当您想应用自定义 SQL 时。

在这些情况下,您可能需要使用 required_joins。如需了解详情,请参阅 required_joins 参数文档页面。