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_outer と relationship: 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.x - 0.17.x
Apache Druid 0.18+
Apache Hive 2.3+
Apache Hive 3.1.2+
Apache Spark 3+
ClickHouse
ClickHouse 26+
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+
Dremio 26+ with Arrow Flight SQL
Exasol
Google BigQuery Legacy SQL
Google BigQuery Standard SQL
Google Cloud AlloyDB for PostgreSQL
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
MongoSQL
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: count(COUNT 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 と 1 対 1 の関係を確立し、その派生テーブルを Explore に結合します。

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