結合

使用状況

探索: explore_name {
join: view_name { ... }
}
階層
join
デフォルト値
なし

許可
既存のビューの名前

特別なルール
  • このパラメータは、ビューの基になるテーブルの名前ではなく、ビュー名を受け入れます(ただし、多くの場合同一です)。
  • 使用する言語が symmetric_aggregates をサポートしていない場合、ほとんどのメジャータイプは結合ビューから除外されます
  • from を使用して、同じビューに複数回参加できます。

定義

join を使用すると、Exploreビューの結合関係を定義して、複数のビューのデータを組み合わせることができます。各 Explore には、ビューをいくつでも参加できます。

各ビューは、データベース内のテーブル、または Looker で定義した派生テーブルに関連付けられていることを思い出してください。同様に、Explore はビューに関連付けられているため、なんらかのテーブルにも接続されます。

Explore に関連付けられたテーブルは、Looker で生成される SQL の FROM 句に配置されます。結合されたビューに関連付けられたテーブルは、Looker が生成する SQL の JOIN 句に配置されます。

主な結合パラメータ

Explore とビューとの結合関係(SQL ON 句)を定義するには、join を他のパラメータと組み合わせて使用する必要があります。

SQL ON 句を設定するには、sql_on または foreign_key パラメータを使用する必要があります。

また、適切な結合の種類と関係を使用していることを確認する必要があります。ただし、type パラメータと relationship パラメータは常に明示的に必須ではありません。デフォルト値 type: left_outerrelationship: many_to_one がユースケースに適している場合、これらのパラメータを除外できます。

主なパラメータと、Looker で生成される SQL との関係を以下に示します。

sql_on

sql_on を使用すると、SQL ON 句を直接記述して結合関係を確立できます。foreign_key と同じ結合を実行できますが、理解と理解が容易になります。

詳しくは、sql_on パラメータに関するドキュメント ページをご覧ください。

foreign_key

foreign_key で、結合されたビューの主キーを使用して結合リレーションシップを作成し、それを Explore のディメンションに関連付けることができます。このパターンはデータベース設計では非常に一般的であり、foreign_key はこれらの場合に結合を表現する洗練された方法です。

詳細については、foreign_key パラメータのドキュメントをご覧ください。

type

Looker のほとんどの結合は、このページの可能な限り結合にビジネス ロジックを適用しないセクションで説明されている理由から LEFT JOIN となっています。そのため、type を明示的に追加しない場合、Looker では LEFT JOIN が必要であると見なされます。ただし、なんらかの理由で別の結合が必要な場合は、type を使用できます。

詳細については、type パラメータのドキュメントをご覧ください。

relationship

上の図では、relationship は Looker で生成される SQL には直接影響しませんが、Looker が正常に動作するためには重要ですrelationship を明示的に追加しない場合、Looker はそれが many-to-one であると想定します。つまり、Explore の多くの行は結合されたビューに 1 行を含めることができます。すべての結合にこのような関係があるわけではなく、他の関係との結合を適切に宣言する必要があります。

詳細については、relationship パラメータのドキュメントをご覧ください。

customer という名前のビューを、結合関係が order である Explore に結合する

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

explore: order {
  join: customer {
    foreign_key: customer_id
    relationship: many_to_one # Could be excluded since many_to_one is the default
    type: left_outer          # Could be excluded since left_outer is the default
  }
}

-

address という名前のビューを、結合関係が person である Explore に結合する

FROM person LEFT JOIN address ON person.id = address.person_id AND address.type = 'permanent':

explore: person {
  join: address {
    sql_on: ${person.id} = ${address.person_id} AND ${address.type} = 'permanent' ;;
    relationship: one_to_many
    type: left_outer # Could be excluded since left_outer is the default
  }
}

-

member という名前のビューを、結合関係が event である Explore に結合する

FROM event INNER JOIN member ON member.id = event.member_id:

explore: event {
  join: member {
    sql_on: ${event.member_id} = ${member.id} ;;
    relationship: many_to_one # Could be excluded since many_to_one is the default
    type: inner
  }
}

-

一般的な課題

join では、基になるテーブル名ではなくビュー名を使用する必要があります

join パラメータはビュー名のみを受け取ります。そのビューに関連付けられたテーブル名を取りません。多くの場合、ビュー名とテーブル名は同一です。その結果、テーブル名を使用できるという誤った結果が生じる可能性があります。

一部の種類のメジャーには対称集計が必要

対称集計を使用しない場合、ほとんどのメジャータイプは結合ビューから除外されます。Looker プロジェクトで対称集計をサポートするには、データベース言語もそれらをサポートしている必要があります。次の表は、Looker の最新リリースで対称集計をサポートしている言語を示しています。

対称集計を使用しない場合、1 対 1 ではない結合関係では、集計関数に不正確な結果が生じる可能性があります。Looker メジャーは集計関数であるため、type: count のメジャー(COUNT DISTINCT として)のみが結合ビューから Explore に取り込まれます。1 対 1 の結合関係がある場合は、relationship パラメータを使用して、次のように他のメジャータイプを含めるように強制できます。

explore: person {
  join: dna {
    sql_on: ${person.dna_id} = ${dna.id} ;;
    relationship: one_to_one
  }
}

Looker がこのような動作をする理由(対称集計をサポートしていない言語の場合)については、ヘルプセンターの SQL ファンアウトの問題をご覧ください。

知っておくべきこと

from を使用して同じテーブルを複数回結合できます。

1 つのテーブルに異なるタイプのエンティティが含まれている場合、ビューを Explore に複数回結合できます。そのためには、from パラメータを使用する必要があります。order Explore があり、person ビューを 2 回、お客様用とカスタマー サービス担当者用に 1 回結合する必要があるとします。次のようにできます。

explore: order {
  join: customer {
    from: person
    sql_on: ${order.customer_id} = ${customer.id} ;;
  }
  join: representative {
    from: person
    sql_on: ${order.representative_id} = ${representative.id} ;;
  }
}

可能であれば、結合にビジネス ロジックを適用しない

Looker 参加の標準的なアプローチは、可能な限り LEFT JOIN を使用することです。以下の方法に沿って操作している場合は、別のアプローチを検討してください。

explore: member_event {
  from: event
  always_join: [member]
  join: member {
    sql_on: ${member_event.member_id} = ${member.id} ;;
    type: inner
  }
}

-

この例では、既知のメンバーに関連付けられたイベントのみを参照する Explore を作成しました。ただし、Looker でこれを実行する場合は、次のように LEFT JOIN を使用してイベントデータとメンバーデータをそのまま取得することをおすすめします。

explore: event {
  join: member {
    sql_on: ${event.member_id} = ${member.id} ;;
  }
}

-

次に、メンバー イベントのみを確認する場合は、yes または no に設定するディメンションを作成します。

dimension: is_member_event {
  type: yesno
  sql: ${member.id} IS NOT NULL ;;
}

-

このアプローチは、ユーザーが必要に応じてすべてのイベントを見るか、メンバーのイベントのみを見るかを選べるため、適している方法です。メンバーを介してメンバーのイベントだけを表示するように強制しているわけではありません。

対称集計を使用しない場合、ファンアウトの原因となる結合を避ける

このセクションは、対称集計をサポートしていないデータベース言語にのみ適用されます。方言が対称集計をサポートしているかどうかを判断するには、このページの一般的な課題で対称集計の説明をご覧ください。

データベース言語が対称集計をサポートしていない場合、ファンアウトにつながる結合は避けてください。つまり、Explore とビューが 1 対多の関係になっている結合は一般的に避ける必要があります。代わりに、ビューから派生テーブルでデータを集約して Explore と 1 対 1 の関係を確立し、派生テーブルを Explore に結合します。

この重要な概念について詳しくは、SQL ファンアウトの問題のヘルプセンター記事をご覧ください。