join

用途


explore: 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 との関係は、次のとおりです。

  • explore パラメータは、生成された SQL クエリの FROM 句のテーブルを決定します。
  • join パラメータは、生成された SQL クエリの JOIN 句を決定します。
    • type パラメータは、SQL 結合のタイプを決定します。
    • sql_on パラメータと foreign_key パラメータによって、生成された SQL クエリの ON 句が決まります。

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 プロジェクトの対称集計をサポートできるようにするには、データベース言語もそれをサポートしている必要があります。次の表に、Looker の最新リリースで対称集計をサポートする言語を示します。

方言 サポート対象
Actian Avalanche
Amazon Athena
Amazon Aurora MySQL
Amazon Redshift
Amazon Redshift 2.1+
Amazon Redshift Serverless 2.1+
Apache Druid
Apache Druid 0.13+
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
Cloudera Impala 3.1+
Cloudera Impala 3.1+ with Native Driver
Cloudera Impala with Native Driver
DataVirtuality
Databricks
Denodo 7
Denodo 8 & 9
Dremio
Dremio 11+
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud PostgreSQL
Google Cloud SQL
Google Spanner
Greenplum
HyperSQL
IBM Netezza
MariaDB
Microsoft Azure PostgreSQL
Microsoft Azure SQL Database
Microsoft Azure Synapse Analytics
Microsoft SQL Server 2008+
Microsoft SQL Server 2012+
Microsoft SQL Server 2016
Microsoft SQL Server 2017+
MongoBI
MySQL
MySQL 8.0.12+
Oracle
Oracle ADWC
PostgreSQL 9.5+
PostgreSQL pre-9.5
PrestoDB
PrestoSQL
SAP HANA
SAP HANA 2+
SingleStore
SingleStore 7+
Snowflake
Teradata
Trino
Vector
Vertica

対称集計がない場合、1 対 1 ではない結合関係では、集計関数で不正確な結果が生成される可能性があります。Looker のメジャーは集計関数であるため、結合されたビューから Explore に取り込まれるのは type: countCOUNT DISTINCT)のメジャーのみです。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 回は顧客用、もう 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 と一対一の関係を確立し、その派生テーブルを Explore に結合します。

この重要なコンセプトについては、コミュニティ投稿の SQL ファンアウトの問題で詳しく説明しています。