foreign_key

用途

explore: view_name_1 {
  join: view_name_2 {
    foreign_key: dimension_name
  }
}
階層
foreign_key
デフォルト値
なし

許可
Looker ディメンション名

特別なルール
  • このフィールドには、基盤となるテーブルの列名ではなく、ディメンション名が指定されることが想定されています(ただし、同じになることもあります)。
  • foreign_keysql_foreign_keysql_on は、同じ join 内で同時に使用できません。
  • 結合されたビューのディメンションのうち 1 つだけが、primary_key パラメータを使用してビューの主キーとして定義されている必要があります。

定義

foreign_key は、ビューとその Explore の間に結合関係を確立します。Looker は、foreign_key で参照されるディメンションを結合されたビューの主キーと照合します。結合されたビューの主キーを設定するには、主キーとして機能するフィールドの primary_key をオンにします。

foreign_key を使用すると、ビューを Explore に直接結合できます。また、その Explore にすでに結合されている 2 つ目のビューを介して結合することもできます。

ビューが Explore に直接結合されている最初のケースの例は次のようになります。

explore: order {
  join: customer {
    foreign_key: customer_id
  }
}

customer の主キーが id という名前であると仮定すると、Looker が生成する SQL は次のようになります。

SELECT    ...
FROM      order
LEFT JOIN customer
ON        order.customer_id = customer.id

2 番目のケースでは、ビューは、その Explore にすでに結合されている中間ビューを介して Explore に結合されます。たとえば、次のようなケースです。

explore: order_items {
  join: order {
    foreign_key: order_id
  }
  join: customer {
    foreign_key: order.customer_id
  }
}

ここでは、customerorder_items に直接結合することはできません。代わりに、order を介して結合する必要があります。ordercustomer の両方の主キーが id という名前であると仮定すると、Looker が生成する SQL は次のようになります。

SELECT    ...
FROM      order_items
LEFT JOIN order
ON        order_items.order_id = order.id
LEFT JOIN customer
ON        order.customer_id = customer.id

これを正しく機能させるため、customer を結合する際に、単に customer_id ではなく、完全スコープのフィールド参照 order.customer_id を使用しています。customer_id のみを使用した場合、Looker は order.customer_id を介さずに customerorder_items.customer_id に直接結合しようとします。

customer の主キーを order.customer_id と照合して、customer という名前のビューを order という名前の Explore に結合します。

explore: order {
  join: customer {
    foreign_key: customer_id
  }
}

order というビューを介して、customer というビューを order_items という Explore に結合します。customer の主キーを order.customer_id と、order の主キーを order_items.order_id と照合します。

explore: order_items {
  join: order {
    foreign_key: order_id
  }
  join: customer {
    foreign_key: order.customer_id
  }
}

orderinventory_item という名前のビューを order_items という名前の Explore に結合します。order の主キーを order_items.order_id と、inventory_item の主キーを order_items.inventory_id と照合します。

explore: order_items {
  join: order {
    foreign_key: order_id
  }
  join: inventory_item {
    foreign_key: inventory_id
  }
}

一般的な課題

foreign_key は列名ではなく、ディメンション名を参照する必要があります

foreign_key パラメータは、基盤となる SQL データベースの列名ではなく、ディメンション名のみを受け取ります。ディメンション名と列名が同じである場合が多く、列名を使用できるという誤った結論に至る可能性があります。

foreign_key で結合されたビューで主キーを定義する必要があります

foreign_key が正しく機能するには、結合されたビューのディメンションの 1 つが、そのビューの主キーとして定義されている必要があります。主キーは primary_key パラメータで定義されます。

主キーとして定義できるディメンションは 1 つだけであるため、複数列の主キーを持つビューで foreign_key を使用することはできません。このような場合は、代わりに sql_on を使用する必要があります。

知っておくべきこと

Looker で結合する方法は foreign_key だけではありません

foreign_key では一部の結合関係を確立できません。たとえば、結合で結合されたビューの主キーが使用されない場合や、複数の条件が結合の一部として必要になる場合があります。このような場合は、代わりに sql_on を使用します。