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 句に基づいて、ビューとその Explore の間に結合関係を確立します。

LookML では、sql_on の条件の順序は関係ありません。したがって、sql_on: ${order.user_id} = ${user.id} ;;sql_on: ${user.id} = ${order.user_id} ;; は同じです。順序がデータベースの SQL 言語に関連していない限り、条件はどちらの順序でも指定できます。

sql_on を使用する場合、ビューは Explore に直接結合することも、その Explore にすでに結合されている 2 番目のビューを介して結合することもできます。

ビューが Explore に直接結合される最初のケースの例は次のようになります。

explore: order {
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

この LookML から Looker が生成する SQL は次のようになります。

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

2 番目のケースでは、ビューは、その Explore にすでに結合されている中間ビューを介して Explore に結合されます。その例を次に示します。

explore: order_items {
  join: order {
    sql_on: ${order_items.order_id} = ${order.id} ;;
  }
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

ここで、customerorder_items に直接結合することはできません。代わりに、order を介して結合する必要があります。この LookML から Looker が生成する SQL は次のようになります。

SELECT    ...
FROM      order_items
LEFT JOIN order
ON        order_items.order_id = order.id
LEFT JOIN customer
ON        order.customer_id = customer.id

これを正しく機能させるには、フィールド参照で正しいビュー名を使用するだけで済みます。customerorder のフィールドに結合する必要があるため、${order.customer_id} を参照します。

古いモデルでは、view_name.native_column_name 構文で参照されるフィールドが表示されることがあります。これは引き続き機能しますが、代わりに ${view_name.looker_dimension_name} 構文を使用すると、required_joins パラメータが不要になるという重要なメリットがあります。このコンセプトについて詳しくは、このページのrequired_joins構文を使用できない場合は${view_name.looker_dimension_name}を使用するをご覧ください。

条件付き結合

ユーザー入力が 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_atcustomer.creation_date_filter の値に設定することを意味します。

_in_query_is_selected_is_filtered Liquid 変数の使用

_in_query_is_selected_is_filtered Liquid 変数は、sql_on パラメータで使用すると便利です。これにより、ユーザーがクエリ用に選択したフィールドに基づいて結合関係を変更できます。次に例を示します。

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 %} ;;
  }
}

ordercustomer_id ディメンションを customerid ディメンションと照合して、customer という名前のビューを order という名前の Explore に結合します。

explore: order {
  join: customer {
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
}

order という名前のビューを介して、customer という名前のビューを order_items という名前の Explore に結合します。ordercustomer_id ディメンションを customerid ディメンションと照合します。order_itemsorder_id ディメンションを orderid ディメンションと照合します。これは次のように指定します。

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 という名前の Explore に結合します。order_itemsinventory_id ディメンションを inventory_itemid ディメンションと照合します。order_itemsorder_id ディメンションを orderid ディメンションと照合します。これは次のように指定します。

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 を使用する

sql_on のフィールドを ${view_name.looker_dimension_name} 構文を使用して参照する場合、required_joins の使用を気にする必要はありません。

ただし、一部の古いモデルでは、view_name.native_column_name 構文が使用されています。カスタム SQL を適用する場合など、${view_name.looker_dimension_name} 構文を使用できない場合もあります。

このような場合は、required_joins を使用する必要があります。詳細については、required_joins パラメータのドキュメント ページをご覧ください。