彙整

用量


explore: explore_name {
  join: view_name { ... }
}
階層
join
預設值

接受
現有檢視畫面的名稱

特別規則
  • 這個參數接受檢視畫面名稱,而非檢視畫面基礎資料表的名稱 (雖然兩者通常相同)
  • 如果方言不支援 symmetric_aggregates,系統會從已加入的檢視畫面中排除大部分的指標類型
  • 你可以使用 from 多次加入同一個檢視畫面。

定義

join 可讓您定義「探索」與「檢視」之間的聯結關係,以便合併多個檢視的資料。您可以視需要將多個資料檢視彙整至探索。

請注意,每個檢視區塊都與資料庫中的資料表,或您在 Looker 中定義的衍生資料表相關聯。同樣地,由於「探索」與檢視區塊相關聯,因此也會連結至某種表格。

與「探索」相關聯的資料表會放在 Looker 產生的 SQL 的 FROM 子句中。與彙整檢視表相關聯的資料表會放在 Looker 產生的 SQL 的 JOIN 子句中。

主要彙整參數

如要定義「探索」和檢視區塊之間的聯結關係 (SQL ON 子句),您需要搭配其他參數使用 join

您必須使用 sql_onforeign_key 參數,才能建立 SQL ON 子句。

您也需要確保使用適當的聯結類型和關係,雖然 typerelationship 參數不一定明確要求。如果預設值 type: left_outerrelationship: many_to_one 適用於您的用途,則可排除這些參數。

這些重要參數及其與 Looker 產生的 SQL 之間的關係,可歸納如下:

  • explore 參數會決定所產生 SQL 查詢的 FROM 子句中的資料表。
  • 每個 join 參數都會決定所生成 SQL 查詢的 JOIN 子句。
    • type 參數會決定 SQL 聯結的類型。
    • sql_on 參數和 foreign_key 參數會決定所產生 SQL 查詢的 ON 子句。

sql_on

sql_on 可讓您直接編寫 SQL ON 子句,建立聯結關係。可完成與 foreign_key 相同的聯結,但更容易閱讀及理解。

詳情請參閱 sql_on 參數說明文件頁面。

foreign_key

foreign_key 可讓您使用已彙整檢視區塊的主鍵建立彙整關係,並將其與探索中的維度連結。這種模式在資料庫設計中非常常見,而 foreign_key 是在這些情況下表示聯結的絕佳方式。

如要完整瞭解,請參閱 foreign_key 參數說明文件頁面。

type

如本頁「盡可能不要在聯結中套用業務邏輯」一節所述,Looker 中的大多數聯結都是 LEFT JOIN。因此,如果您未明確新增 type,Looker 會假設您要使用 LEFT JOIN。不過,如果因為某些原因需要其他類型的聯結,可以使用 type 執行這項操作。

如需完整說明,請參閱 type 參數說明文件頁面。

relationship

relationship 不會直接影響 Looker 產生的 SQL,但對 Looker 的正常運作至關重要。如果沒有明確新增 relationship,Looker 會將關係解讀為 many-to-one,也就是說,探索中的多個資料列可以有一個聯結檢視中的資料列。並非所有聯結都有這類關係,其他關係的聯結則須正確宣告。

如要完整瞭解,請參閱 relationship 參數說明文件頁面。

範例

將名為 customer 的檢視區塊加入名為 order 的探索,其中聯結關係為

FROM order LEFT JOIN customer ON order.customer_id = customer.id

explore: order {
  join: customer {
    foreign_key: customer_id
    relationship: many_to_one # Could be excluded since many_to_one is the default
    type: left_outer          # Could be excluded since left_outer is the default
  }
}

將名為 address 的檢視區塊加入名為 person 的探索,其中聯結關係為

FROM person LEFT JOIN address ON person.id = address.person_id AND address.type = 'permanent'

explore: person {
  join: address {
    sql_on: ${person.id} = ${address.person_id} AND ${address.type} = 'permanent' ;;
    relationship: one_to_many
    type: left_outer # Could be excluded since left_outer is the default
  }
}

將名為 member 的檢視區塊加入名為 event 的探索,其中聯結關係為

FROM event INNER JOIN member ON member.id = event.member_id

explore: event {
  join: member {
    sql_on: ${event.member_id} = ${member.id} ;;
    relationship: many_to_one # Could be excluded since many_to_one is the default
    type: inner
  }
}

常見挑戰

join 必須使用檢視表名稱,而非基礎資料表名稱

join 參數只會採用檢視表名稱,不會採用與該檢視表相關聯的資料表名稱。檢視區塊名稱和資料表名稱通常相同,這可能會導致錯誤的結論,以為可以使用資料表名稱。

部分類型的指標需要對稱匯總

如果未使用對稱匯總,大部分的測量指標類型都會從已聯播的檢視畫面中排除。如要讓 Looker 專案支援對稱匯總,資料庫方言也必須支援。下表列出最新版 Looker 中支援對稱匯總的方言:

方言 是否支援?
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

如果沒有對稱匯總,非一對一的聯結關係可能會在匯總函式中產生不準確的結果。由於 Looker 評估指標是匯總函式,因此只有type: count (如 COUNT DISTINCT) 的評估指標會從已聯結的檢視區塊帶入「探索」。如果有一對一的彙整關係,可以使用 relationship 參數強制納入其他指標類型,如下所示:

explore: person {
  join: dna {
    sql_on: ${person.dna_id} = ${dna.id} ;;
    relationship: one_to_one
  }
}

如要進一步瞭解 Looker 採用這種做法的原因 (適用於不支援對稱匯總的方言),請參閱「SQL 扇出問題」社群貼文。

注意事項

您可以使用 from 多次彙整同一個資料表

如果單一資料表包含不同類型的實體,檢視區塊可能會多次加入「探索」。如要這麼做,請使用 from 參數。假設您有 order Explore,需要加入 person 檢視畫面兩次:一次是為客戶,一次是為客戶服務代表。您可能會執行類似下列的操作:

explore: order {
  join: customer {
    from: person
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
  join: representative {
    from: person
    sql_on: ${order.representative_id} = ${representative.id} ;;
  }
}

盡量不要在聯結中套用商業邏輯

標準的 Looker 聯結方法是盡可能使用 LEFT JOIN。如果您發現自己正在執行類似下列的操作,請考慮採用其他方法:

explore: member_event {
  from: event
  always_join: [member]
  join: member {
    sql_on: ${member_event.member_id} = ${member.id} ;;
    type: inner
  }
}

在這個範例中,我們建立的「探索」會查看與已知成員相關聯的事件。不過,在 Looker 中執行這項操作的偏好方式是使用 LEFT JOIN,將事件資料和會員資料合併在一起,如下所示:

explore: event {
  join: member {
    sql_on: ${event.member_id} = ${member.id} ;;
  }
}

然後,如果您只想查看成員活動,可以建立維度並設為 yesno,如下所示:

dimension: is_member_event {
  type: yesno
  sql: ${member.id} IS NOT NULL ;;
}

這種做法較為理想,因為使用者可彈性選擇查看所有事件,或只查看成員事件。您並未強制他們只能透過加入功能查看成員活動。

如果未使用對稱匯總,請避免導致扇出的聯結

本節僅適用於不支援對稱彙整的資料庫方言。請參閱本頁「常見挑戰」一節中對稱彙整的討論內容,判斷您的方言是否支援對稱彙整。

如果資料庫方言不支援對稱匯總,請避免產生扇出的聯結。換句話說,一般應避免在「探索」和檢視區塊之間建立一對多關係的聯結。請改為在衍生資料表中匯總檢視區塊的資料,與「探索」建立一對一關係,然後將該衍生資料表彙整至「探索」。

如要進一步瞭解這項重要概念,請參閱社群貼文「SQL 扇出問題」。