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.x - 0.17.x
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 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
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 の測定は集計関数であるため、type: countCOUNT 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 回は顧客用、もう 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 ファンアウトの問題で詳しく説明しています。