用途
explore: view_name_1 {
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} ;;
}
}
この 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} ;;
}
}
ここでは、customer を order_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
これを正しく機能させるには、フィールド参照で正しいビュー名を使用する必要があります。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 の値に設定する」と解釈されます。
_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 %} ;;
}
}
例
order の customer_id ディメンションを customer の id ディメンションと照合して、customer という名前のビューを order という名前の Explore に結合します。
explore: order {
join: customer {
sql_on: ${order.customer_id} = ${customer.id} ;;
}
}
order というビューを介して、customer というビューを 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 を使用する
${view_name.looker_dimension_name} 構文を使用して sql_on のフィールドを参照する場合、required_joins の使用を気にする必要はありません。
ただし、一部の古いモデルでは、引き続き view_name.native_column_name 構文が使用されています。カスタム SQL を適用する場合など、${view_name.looker_dimension_name} 構文を使用できない場合もあります。
このような場合は、required_joins を使用する必要があります。詳細については、required_joins パラメータのドキュメント ページをご覧ください。