與 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
檢視畫面 (即「探索」中的主要檢視畫面) 會與 users
檢視畫面以 SQL LEFT OUTER JOIN
聯結,如 type: left_outer
LookML 參數所示。SQL ON
子句 (由 sql_on
LookML 參數定義) 不會使用 table_alias.column
,而是參照 to ${view_name.field_name}
。這樣一來,如果資料庫中的資料表名稱或欄名有變更,您只需要在一個位置進行變更。
relationship
參數非常重要。聯結可能會導致扇出問題,造成資料列重複。指定多筆訂單只會加入一位使用者後,Looker 會辨識出這個聯結不會發生扇出,因此不需要特殊處理。不過,one_to_many
關係可能會觸發扇出。
系統預設會以左外部聯結自動產生檢視區塊和探索。不過,在先前的範例中,每筆訂單很可能只有一位使用者,因此這個範例中的聯結可以是內部聯結。
如要查看產生的探索 SQL,請在使用者介面中執行探索,然後在「資料」面板中選取「SQL」分頁。
舉例來說,如果您開啟先前定義的「訂單」探索,然後選取「使用者 ID」和「計數」欄位,產生的 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
在本例中,完全沒有參照使用者表格。只有在需要時才會導入。
如果您移除「使用者 ID」維度,並從「使用者」檢視畫面中加入「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
在本例中,由於「使用者」檢視畫面中有選取項目,因此會納入聯結。
以下範例顯示先前定義的 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
}
}
現在,如果您在 UI 中開啟「Orders」探索,會看到「Order Items」檢視畫面。如果您從「訂單項目」檢視畫面選取「銷售總價」指標,並從「訂單」和「使用者」選取「計數」和「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 DISTINCT
關鍵字新增至 SQL COUNT
函式。