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 をサポートしています。これらは、type パラメータの値 left_outerinnerfull_outercross に対応します。

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 の変更のテストについて詳しくは、LookML の編集と検証をご覧ください。

別のビューを介した結合

別のビューを介してビューを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
はい
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+
はい
ネイティブ ドライバを使用した Cloudera Impala
いいえ
DataVirtuality
はい
Databricks
はい
Denodo 7
はい
Denodo 8
はい
Dremio
いいえ
Dremio 11+
はい
Exasol
はい
Firebolt
はい
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 9.5 より前
はい
PrestoDB
はい
PrestoSQL
はい
SAP HANA 2+
はい
SingleStore
はい
SingleStore 7+
はい
Snowflake
はい
Teradata
はい
Trino
はい
Vector
はい
Vertica
はい

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

結合についての詳細

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