sql_on

用量

explore: view_name_1 {
  join: view_name_2 {
    sql_on: ${view_name_1.id} = ${view_name_2.id} ;;
  }
}
階層
sql_on
預設值

接受
SQL ON 子句

特別規則
sql_onsql_foreign_keyforeign_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} ;;
  }
}

將名為 orderinventory_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 參數說明文件頁面。