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 パラメータが不要になるという大きなメリットがあります。このコンセプトの詳細については、このページの${view_name.looker_dimension_name} 構文を使用できない場合は required_joins を使用するをご覧ください。

条件付き結合

また、sql_on でユーザー入力を使用できるようにすることもできます。これを行う理由はさまざまですが、結合句の条件に関するコミュニティ投稿で説明されているように、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 変数の使用

sql_on パラメータと組み合わせて使用すると、_in_query_is_selected_is_filteredLiquid 変数が役立ちます。ユーザーがクエリで選択したフィールドに基づいて結合関係を変更できます。次に例を示します。

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

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

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

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