用法
explore: view_name_1 {
join: view_name_2 {
sql_on: ${view_name_1.id} = ${view_name_2.id} ;;
}
}
|
层次结构
sql_on |
默认值
无
接受
SQL ON 子句
特殊规则
sql_on、sql_foreign_key 和 foreign_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} ;;
}
}
将名为 order 和 inventory_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 参数文档页面。