LookMLでの結合の使用

結合を使用すると、異なるビューに接続できるため、複数のビューから同時にデータを探索し、データのさまざまな部分が互いにどのように関連しているかを確認できます。

たとえば、データベースにテーブル order_itemsordersusers が含まれている場合があります。すべてのテーブルから同時にデータを探索するために、結合を使用できます。このページでは、特定の結合パラメータや結合のパターンなど、LookML での結合について紹介します。

結合は Explore から開始

結合は、モデルファイルで定義され、Exploreビューの関係を確立します。結合は 1 つ以上のビューを単一の Explore に、直接、または他の結合されたビューを介して連結します。

2 つのデータベース テーブル order_itemsorders について検討します。両方のテーブルのビューを生成してから、それらの 1 つ以上を、モデルファイルの explore パラメータで次のように宣言します。

explore: order_items { ... }

order_items Explore からクエリを実行すると、生成された SQL の FROM 句に order_items が表示されます。

SELECT ...
FROM order_items

order_items Explore に追加情報を結合できます。たとえば、次のサンプル LookML を使用して、orders ビューを order_items Explore に結合できます。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
  }
}

前に示した LookML は 2 つのことを達成します。まず、Explore フィールド ピッカーordersorder_items の両方のフィールドを表示できます。

注文された商品アイテム Explore には、注文された商品アイテムビューのフィールドと、結合された注文ビューのフィールドが含まれます。

次に、LookML は ordersorder_items を結合する方法を記述します。この LookML が、次のようなSQLに変換されます。

SELECT ...
FROM order_items
LEFT JOIN orders
ON order_items.order_id = orders.id

これらの LookML パラメータについては、以下のセクションで詳しく説明します。

結合パラメータ

結合には、4 つの主要なパラメータ(jointyperelationshipsql_on)が使用されます。

ステップ1:Exploreの開始

まず、order_items Explore を作成します。

explore: order_items { ... }

ステップ 2: join

テーブルを結合する場合は、まずビューでテーブルを宣言する必要があります。この例では、orders がモデルの既存のビューであるとします。

次に、join パラメータを使用して、orders ビューを order_items Explore に結合することを宣言します。

explore: order_items {
  join: orders { ... }
}

ステップ 3: type

実行する結合のタイプを検討します。Looker は LEFT JOININNER JOINFULL OUTER JOINCROSS JOIN をサポートしています。これらは、left_outerinnerfull_outercrosstype パラメータ値に対応しています。

explore: order_items {
  join: orders {
    type: left_outer
  }
}

type のデフォルト値は left_outer です。

ステップ 4: relationship

order_items Explore と orders ビューの間の結合関係を定義します。Looker が正確なメジャー計算するには、結合の関連性を適切に宣言することが重要です。関係は、order_items Explore から orders ビュー定義されます。指定できるオプションは、one_to_onemany_to_oneone_to_manymany_to_many です。

この例では、単一の注文に対して多くの注文された商品アイテムが存在する可能性があります。order_items Explore から orders ビューへの関係は many_to_one です。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
  }
}

結合に relationship パラメータを含めない場合、Looker はデフォルトで many_to_one を使用します。

結合に対して relationship パラメータを正しく定義する追加のヒントについては、relationship パラメータを正しく取得するをご覧ください。

ステップ 5: sql_on

sql_on パラメータと foreign_key パラメータのいずれかを使用して、order_items テーブルと orders テーブルを結合する方法を宣言します。

sql_on パラメータは、クエリ用に生成された SQL の ON 句と同等です。このパラメータを使用して、どのフィールドを組み合わせて結合を行うかを宣言できます。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
  }
}

もっと複雑な結合を記述することもできます。例えば、id が1,000より大きいオーダーだけを結合する必要があるかもしれません。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} AND ${orders.id} > 1000 ;;
  }
}

これらの例の ${ ... } 構文の詳細については、置換演算子のドキュメントをご覧ください。

ステップ6:テスト

[Order Items] に移動して、この結合が期待通り機能するかテストします。order_itemsorders の両方のフィールドが表示されるはずです。

Explore で LookML の変更箇所をテストする方法については、Explore のフィールドのテストをご覧ください。

別のビューを介した結合

別のビューを介してビューをExploreに結合できます。結合パラメータの例では、order_id フィールドを使用して ordersorder_items に結合しました。また、共通のフィールドがなくても、users というビューのデータを order_items Explore に結合することもできます。これは、orders ビューを介して結合することで実現できます。

order_items Explore ではなく、sql_on パラメータまたは foreign_key パラメータを使用して users ビューを orders ビューに結合します。これは、orders のフィールドを orders.user_id と正しくスコーピングすることによって行います。

sql_on パラメータを使用した例を次に示します。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
  }
  join: users {
    type: left_outer
    relationship: many_to_one
    sql_on: ${orders.user_id} = ${users.id} ;;
  }
}

ビューの複数回結合

users ビューには、購入者販売者の両方のデータが含まれます。このビューのデータを order_items に結合するが、購入者と販売者で別々にそれを行うには、from パラメータを使用して異なる名前で users を 2 回結合します。

from パラメータを使用すると、結合に固有の名前を付けて、その結合でどのビューを使用するかを指定できます。次に例を示します。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
  }
  join: buyers {
    from: users
    type: left_outer
    relationship: many_to_one
    sql_on: ${orders.buyer_id} = ${buyers.id} ;;
  }
  join: sellers {
    from: users
    type: left_outer
    relationship: many_to_one
    sql_on: ${orders.seller_id} = ${sellers.id} ;;
  }
}

この場合、buyers として結合されるのは購入者データのみであり、sellers として結合されるのは販売者データのみです。

: users ビューは、結合でエイリアス名 buyerssellers で参照する必要があります。

結合からのフィールドの制限

fields パラメータを使用すると、結合から Explore に取り出すフィールドを指定できます。デフォルトでは、ビューのすべてのフィールドが結合時に取り出されます。しかし、一部のフィールドだけを取り出したい場合もあります。

たとえば、ordersorder_items に結合されている場合は、結合で shipping フィールドと tax フィールドのみを取り出すことができます。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
    fields: [shipping, tax]
  }
}

[set_a*] など、一連のフィールドを参照することもできます。各セットは、set パラメータを使用してビュー内で定義します。orders ビューで次のセットが定義されているとします。

set: orders_set {
  fields: [created_date, shipping, tax]
}

ordersorder_items に結合するときに、次の 3 つのフィールドのみを取り出すように選択できます。

explore: order_items {
  join: orders {
    type: left_outer
    relationship: many_to_one
    sql_on: ${order_items.order_id} = ${orders.id} ;;
    fields: [orders_set*]
  }
}

対称集計

Looker は、結合によってファンアウトが起こっても、集計(合計や平均など)を正しく計算するために「対称集計」と呼ばれる機能を使用しています。対称集計については、対称集計についてで詳しく説明されています。対称集計が解決するファンアウトの問題については、SQL ファンアウトの問題に関するコミュニティ投稿をご覧ください。

必要なプライマリキー

結合からメジャー(集計)を得るには、その結合に関係しているすべてのビューでプライマリキーを定義する必要があります。

これを行うには、各ビューの主キーフィールド定義に primary_key パラメータを追加します。

dimension: id {
  type: number
  primary_key: yes
}

サポートされている SQL 言語

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

お使いの言語が対称集計をサポートしていない場合は、Lookerで結合を実行するときに注意してください。結合のタイプによっては集計が不正確になることがあります(合計や平均など)。この問題とその回避策については、SQL ファンアウトの問題に関するコミュニティ投稿で詳しく説明されています。

結合についての詳細

LookML の結合パラメータの詳細については、結合リファレンス ドキュメントをご覧ください。