用量
explore: explore_name {
join: view_name { ... }
}
|
階層
join |
預設值
無
接受
現有檢視畫面的名稱
特別規則
|
定義
join 可讓您定義「探索」與「檢視」之間的聯結關係,以便合併多個檢視的資料。您可以視需要將多個資料檢視彙整至探索。
請注意,每個檢視區塊都與資料庫中的資料表,或您在 Looker 中定義的衍生資料表相關聯。同樣地,由於「探索」與檢視區塊相關聯,因此也會連結至某種表格。
與「探索」相關聯的資料表會放在 Looker 產生的 SQL 的 FROM 子句中。與彙整檢視表相關聯的資料表會放在 Looker 產生的 SQL 的 JOIN 子句中。
主要彙整參數
如要定義「探索」和檢視區塊之間的聯結關係 (SQL ON 子句),您需要搭配其他參數使用 join。
您必須使用 sql_on或 foreign_key 參數,才能建立 SQL ON 子句。
您也需要確保使用適當的聯結類型和關係,雖然 type 和 relationship 參數不一定明確要求。如果預設值 type: left_outer 和 relationship: 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} ;;
}
}
然後,如果您只想查看成員活動,可以建立維度並設為 yes 或 no,如下所示:
dimension: is_member_event {
type: yesno
sql: ${member.id} IS NOT NULL ;;
}
這種做法較為理想,因為使用者可彈性選擇查看所有事件,或只查看成員事件。您並未強制他們只能透過加入功能查看成員活動。
如果未使用對稱匯總,請避免導致扇出的聯結
如果資料庫方言不支援對稱匯總,請避免產生扇出的聯結。換句話說,一般應避免在「探索」和檢視區塊之間建立一對多關係的聯結。請改為在衍生資料表中匯總檢視區塊的資料,與「探索」建立一對一關係,然後將該衍生資料表彙整至「探索」。
如要進一步瞭解這項重要概念,請參閱社群貼文「SQL 扇出問題」。