使用状況
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
句に基づいて、ビューと 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} ;;
}
}
ここでは、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
でユーザー入力を使用できるようにすることもできます。さまざまな理由があるかもしれませんが、このコミュニティのトピックで説明しているように、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
の値と等しくなるように設定します。
Liquid 変数 _in_query
、_is_selected
、_is_filtered
の使用
_in_query
、_is_selected
、_is_filtered
の Liquid 変数は、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 に結合するには、order
の customer_id
ディメンションと customer
の id
ディメンションを照合します。
explore: order {
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
customer
という名前のビューを、order
という名前のビューを介して order_items
という名前の Explore に結合します。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
という名前の Explore に結合します。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
を使用する
sql_on
で ${view_name.looker_dimension_name}
構文を使用してフィールドを参照する場合、required_joins
を使用する必要はありません。
ただし、一部の古いモデルでは引き続き view_name.native_column_name
構文が使用されます。また、カスタム SQL を適用する場合など、${view_name.looker_dimension_name}
構文を使用できない場合もあります。
そのような場合は、required_joins
の使用が必要になることがあります。それらについて詳しくは、required_joins
パラメータに関するドキュメント ページをご覧ください。