sql_on

使用状況

探索: 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} ;;
  }
}

Looker がこの LookML から生成する SQL は次のとおりです。

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

2 番目のケースでは、すでにその Explore に結合されている中間ビューを介して 1 つのビューが 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 を介して結合する必要があります。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

これを機能させるには、フィールド参照で正しいビュー名を使用するだけで済みます。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 の値と等しくなるように設定します。

Liquid 変数 _in_query_is_selected_is_filtered の使用

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

explore: dates {
  join: dynamic_order_counts {
    sql_on:
      ${dynamic_order_counts.period} =
      {% dynamic if dates.reporting_date._in_query %}
        ${dates.date_string}
      {% elsif dates.reporting_week._in_query %}
        ${dates.week_string}
      {% dynamic else %}
        ${dates.month_string}
      {% dynamic endif %} ;;
  }
}

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

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

customer という名前のビューを、order という名前のビューを介して 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} ;;
  }
}

order という名前のビューと inventory_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 パラメータに関するドキュメント ページをご覧ください。