派生表的 SQL 概念

虽然 LookML 视图通常基于数据库中的现有表,但您也可以创建基于 SQL SELECT 语句的视图。在 Looker 中,此类视图称为“派生表”。派生表是指其结果的使用方式与数据库中的实际表相同的查询。

在本指南中,您将了解以下主题:

Looker 如何为派生表生成 SQL

在 LookML 中查询派生表时,Looker 会将您的查询转换为 SQL 语句,具体取决于方言,这些语句可以是通用表表达式 (CTE) 或内嵌视图。换句话说,生成的 SQL 查询可能类似于以下示例之一。

以下示例展示了 Looker 如何生成使用 CTE 查询派生表的 SQL 查询:

WITH (
    SELECT o.user_id as id
    FROM orders AS o
    INNER JOIN order_items AS oi ON o.id == oi.order_id
    ORDER BY SUM(oi.total_sale_price) DESC
    GROUP BY o.customer_id
    LIMIT 100
    ) AS top_100_users
SELECT ...
FROM users AS u
INNER JOIN top_100_users ON u.id == top_100_users.id
WHERE ...

以下示例展示了 Looker 如何生成使用内嵌视图查询派生表的 SQL 查询:

SELECT ...
FROM users AS u
INNER JOIN (
    SELECT o.user_id as id
    FROM orders AS o
    INNER JOIN order_items AS oi ON o.id == oi.order_id
    ORDER BY SUM(oi.total_sale_price) DESC
    GROUP BY o.customer_id
    LIMIT 100
    ) AS top_100_users ON u.id == top_100_users.id
WHERE ...

基于 SQL 的派生表

如需创建基于 SQL 的派生表,您可以直接在 LookML 中定义 SQL 查询,方法是使用视图的 derived_table 参数中的 sql 参数。这样,您就可以使用 SQL 定义派生表的列。

例如,以下 LookML 示例定义了一个名为 top_100_users 的派生表,用于确定所有订单总支出最高的前 100 位用户:

view: top_100_users {
  derived_table: {
    sql: SELECT o.user_id as id
         FROM orders AS o
         INNER JOIN order_items AS oi ON o.id == oi.order_id
         ORDER BY SUM(oi.total_sale_price) DESC
         GROUP BY o.customer_id
         LIMIT 100 ;;
  }

  dimension: id {
    type: number
    sql: ${TABLE}.id ;;
  }
}

当“探索”查询中引用 top_100_users 视图时,Looker 会在生成的 SQL 中将此 SQL SELECT 语句用作 CTE 或内嵌视图,具体取决于您的方言。

使用 SQL 定义派生表可能会受到一些限制。例如,在“基于 SQL 的派生表”部分中的示例中,请遵循以下注意事项:

  • orders 表和 order_items 表之间的关系可能已在 LookML 模型中定义。如果数据库中的底层表名称发生变化,则必须在多个位置更新表名称,包括基于 SQL 的派生表的定义中。
  • 派生表定义中的 SQL 必须采用底层数据库的正确方言。如果数据移至其他数据库,则需要更改基于 SQL 的派生表的定义。

因此,原生派生表通常是更好的选择。

原生派生表

在 Looker 中,原生派生表是使用 LookML 定义的。与使用基于 SQL 的派生表相比,定义原生派生表时,您会以以下方式利用 LookML 模型:

  • 如果数据库中的表名称发生变化,您只需在 LookML 模型中更新一次即可。由于原生派生表指向定义数据库表的现有 LookML 对象,因此原生派生表会自动引用相应表。
  • 同样,如果您改用其他方言,原生派生表的 LookML 仍会有效,因为 Looker 会生成适合您的数据库连接的 SQL。

您可以手动为原生派生表定义 LookML。不过,创建原生派生表的最简单方法是让 Looker 根据“探索”查询创建派生表。在“探索”中,选择要在派生表中使用的字段,然后依次选择“探索”齿轮菜单中的获取 LookML > 派生表选项以获取 LookML。Looker 会生成您需要的 LookML,以便您根据探索查询创建派生表,包括 LookML 模型中用于创建派生表的列所需的相关字段定义。您可以将 LookML 复制到项目中的视图文件中,以创建派生表。

以下示例展示了一个原生派生表,用于确定在所有订单中的总支出最高的前 100 名用户:

view: top_100_users {
  derived_table: {
    explore_source:  orders {
      column: id {
        field: orders.customer_id
      }
      sorts: [order_items.sum_total_sale_price desc]
      limit: 100
    }
  }
}

在探索中查询原生派生表时,系统会自动生成原生派生表的 SQL 查询的所有详细信息。具有原生派生表的 LookML 视图的列定义会从底层探索的定义中推断出来,因此无需重复任何定义。

永久性派生表 (PDT)

在 Looker 中,您可以创建临时派生表永久派生表。创建基于 SQL 的派生表或原生派生表后,您可以添加持久性,以便 Looker 将表写入数据库中的临时架构,并按您指定的时间表重新生成该表。如需了解详情,请参阅 Looker 中的派生表