与 SQL 一样,LookML 中的 联接用于根据两个或多个表之间的相关列,将这些表中的行组合起来。
在 LookML 中,探索(由 explore LookML 参数定义)用于定义用户如何查询数据。探索由至少一个视图或一组联接在一起的视图组成。探索中的主要视图始终包含在查询中。联接的视图通常仅在满足查询需要时才会包含在查询中。
LookML 视图对应于数据库中的 SQL 表(或具有表结构的其他元素),或对应于 派生表。视图定义了数据库中可用的字段或列,以及应如何访问这些字段或列。
以下示例是 orders 探索的定义。
explore: orders {
join: users {
type: left_outer
sql_on: ${orders.user_id} = ${users.id} ;;
relationship: many_to_one
}
}
orders 视图(探索中的主要视图)通过 SQL LEFT OUTER JOIN 与 users 视图联接,如 type: left_outer LookML 参数所示。SQL ON 子句(由 sql_on LookML 参数定义)不使用 table_alias.column,而是引用 to ${view_name.field_name}。这样,如果表名称或列名称在数据库中发生更改,则只需在一个位置进行更改。
The relationship 参数非常重要。联接可能会导致 扇出 问题,即行重复。通过指定多个订单将仅联接到一个用户,Looker
可以识别出此联接不会发生扇出,因此不需要特殊处理。不过,one_to_many 关系可能会触发扇出。
自动生成的视图和探索默认使用左外联接。不过,在前面的示例中,每个订单很可能只有一个用户,因此此示例中的联接可以是内联接。
如需查看探索生成的 SQL,您可以在界面中运行探索,然后在数据面板中选择SQL标签页。
例如,如果您打开之前定义的 Orders 探索,然后选择 User ID 和 Count 字段,生成的 SQL 将如下所示:
SELECT
`user_id` AS `orders.user_id`,
COUNT(*) AS `orders.count`
FROM
`thelook`.`orders` AS `orders`
GROUP BY
1
ORDER BY
2 DESC
LIMIT 500
在此示例中,users 表根本未被引用。只有在需要时才会引入该表。
如果您移除 User ID 维度,并在 Users 视图中添加 ID 维度,SQL 将如下所示:
SELECT
`users`.`id` AS `users.id`,
COUNT(*) AS `orders.count`
FROM
`thelook`.`orders` AS `orders`
INNER JOIN `thelook`.`users` AS `users` ON `orders`.`user_id` = `users`.`id`
GROUP BY
1
ORDER BY
2 DESC
LIMIT 500
在这种情况下,由于选择了 Users 视图,因此会包含联接。
以下示例展示了之前定义的 orders 探索文件中的 LookML,并向 order_items 视图添加了联接:
explore: orders {
join: users {
type: inner
sql_on: ${orders.user_id} = ${users.id} ;;
relationship: many_to_one
}
join: order_items {
type: inner
sql_on: ${orders.id} = ${order_items.order_id} ;;
relationship: one_to_many
}
}
现在,如果您在界面中打开 Orders 探索,您将看到 Order Items 视图。如果您从 Order Items 视图中选择 Total Sale Price 测量,并从 Orders 中选择 Count,以及从 Users 中选择 ID,Looker 将生成以下 SQL:
SELECT
`users`.`id` AS `users.id`,
COUNT(DISTINCT orders.id ) AS `orders.count`,
COALESCE(SUM(`order_items`.`sale_price`), 0) AS `order_items.total_sale_price`
FROM
`thelook`.`orders` AS `orders`
INNER JOIN `thelook`.`users` AS `users` ON `orders`.`user_id` = `users`.`id`
INNER JOIN `thelook`.`order_items` AS `order_items` ON `orders`.`id` = `order_items`.`order_id`
GROUP BY
1
ORDER BY
2 DESC
LIMIT 500
在此示例中,COUNT(*) AS orders.count 变为 COUNT(DISTINCT orders.id ) AS orders.count。Looker 检测到可能存在扇出情况,并自动向 SQL COUNT 函数添加了 SQL DISTINCT
关键字。