用量
explore: view_name_1 {
join: view_name_2 {
sql_on: ${view_name_1.id} = ${view_name_2.id} ;;
}
}
|
階層
sql_on |
預設值
無
接受
SQL ON 子句
特別規則
sql_on、sql_foreign_key 和 foreign_key 可能無法在同一個 join 中同時使用
|
定義
sql_on 會根據您提供的 SQL ON 子句,在檢視區塊和其探索之間建立彙整關係。
如果是 LookML,sql_on 中的條件順序沒有影響。因此 sql_on: ${order.user_id} = ${user.id} ;; 和 sql_on: ${user.id} = ${order.user_id} ;; 是等效的。除非順序與資料庫的 SQL 方言相關,否則條件的順序不限。
使用 sql_on 時,檢視區塊可以直接加入探索,也可以透過已加入該探索的第二個檢視區塊加入。
第一個案例的範例 (資料檢視表直接彙整至探索) 如下所示:
explore: order {
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
Looker 會從這個 LookML 產生下列 SQL:
SELECT ...
FROM order
LEFT JOIN customer
ON order.customer_id = customer.id
在第二種情況中,檢視表會透過已加入該探索的中間檢視表,加入探索。舉例來說:
explore: order_items {
join: order {
sql_on: ${order_items.order_id} = ${order.id} ;;
}
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
這裡的「customer」無法直接加入「order_items」,而是必須透過 order 加入。Looker 會從這個 LookML 產生下列 SQL:
SELECT ...
FROM order_items
LEFT JOIN order
ON order_items.order_id = order.id
LEFT JOIN customer
ON order.customer_id = customer.id
如要讓這項功能正常運作,您會發現我們只需要在欄位參照中使用正確的檢視區塊名稱。由於 customer 需要加入 order 中的欄位,因此我們參照 ${order.customer_id}。
在某些舊型號中,您可能會看到以
view_name.native_column_name語法參照的欄位。雖然這種做法仍有效,但改用${view_name.looker_dimension_name}語法有個重要優點:您可以避免使用required_joins參數。如要進一步瞭解這個概念,請參閱本頁的「無法使用${view_name.looker_dimension_name}語法時,請使用required_joins」一節。
條件式彙整
您也可以允許在 sql_on 中使用使用者輸入內容。您可能會基於各種原因而希望這麼做,但如「條件位於 Join 子句中」社群貼文所述,在 MPP 資料庫 (例如 Redshift) 中最佳化查詢速度是主要用途。
如要將使用者輸入內容新增至聯結條件,請先為輸入內容建立篩選器。如要進一步瞭解這些類型的篩選器,請參閱「範本篩選器」頁面。基本形式如下:
view: view_name {
filter: filter_name {
type: number | datetime | date | string
}
}
新增篩選器來收集使用者輸入內容後,即可在 sql_on 參數中使用,如下所示:
{% condition view_name.filter_name %} view_name.dimension_name {% endcondition %}
例如:
explore: order {
join: customer {
sql_on:
${order.customer_id} = ${customer.id} AND
{% condition customer.creation_date_filter %} customer.created_at {% endcondition %} ;;
}
}
這表示:將 customer.created_at 設為等於 customer.creation_date_filter 的值。
使用 _in_query、_is_selected 和 _is_filtered Liquid 變數
搭配 sql_on 參數使用時,_in_query、_is_selected 和 _is_filtered Liquid 變數會很有用。您可以根據使用者為查詢選取的欄位,修改聯結關係。例如:
explore: dates {
join: dynamic_order_counts {
sql_on:
${dynamic_order_counts.period} =
{% if dates.reporting_date._in_query %}
${dates.date_string}
{% elsif dates.reporting_week._in_query %}
${dates.week_string}
{% else %}
${dates.month_string}
{% endif %} ;;
}
}
範例
將名為 customer 的檢視區塊與名為 order 的探索項目彙整,方法是將 order 中的 customer_id 維度與 customer 中的 id 維度相符:
explore: order {
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
透過名為 order 的檢視區塊,將名為 customer 的檢視區塊加入名為 order_items 的探索。將 order 中的 customer_id 維度與 customer 中的 id 維度配對。將 order_items 中的 order_id 維度與 order 中的 id 維度配對。這會指定如下:
explore: order_items {
join: order {
sql_on: ${order_items.order_id} = ${order.id} ;;
}
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
將名為 order 和 inventory_items 的檢視區塊彙整至名為 order_items 的探索。將 order_items 中的 inventory_id 維度與 inventory_item 中的 id 維度配對。將 order_items 中的 order_id 維度與 order 中的 id 維度配對。這會指定如下:
explore: order_items {
join: order {
sql_on: ${order_items.order_id} = ${order.id} ;;
}
join: inventory_item {
sql_on: ${order_items.inventory_id} = ${inventory_item.id} ;;
}
}
注意事項
無法使用 ${view_name.looker_dimension_name} 語法時,請改用 required_joins
使用 ${view_name.looker_dimension_name} 語法參照 sql_on 中的欄位時,不必擔心使用 required_joins。
不過,部分舊版模型仍使用 view_name.native_column_name 語法。此外,在某些情況下,您無法使用 ${view_name.looker_dimension_name} 語法,例如想套用自訂 SQL 時。
在這種情況下,您可能需要使用 required_joins。如需詳細說明,請參閱 required_joins 參數說明文件頁面。