派生表的 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 的派生表,您可以在视图的 derived_table 参数中使用 sql 参数直接在 LookML 中定义 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 >“探索”齿轮菜单中的 Derived Table 选项,以获取 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 中的派生表