關於 SQL 彙整的概念

與 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 函式。