使用状況
join: view_name { ... }
}
階層
join |
デフォルト値
なし許可
既存のビューの名前特別なルール
|
定義
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_outer
と relationship: 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 ファンアウトの問題のヘルプセンター記事をご覧ください。