LoginSignup
5
5

More than 3 years have passed since last update.

LookerでのRelation Ship指定と主キー

Last updated at Posted at 2020-04-30

概要

  • modelでのrelation shipの指定を間違えたので、備忘の為にメモします。
  • 初歩の初歩なので、詳しい方はスルー して下さい。

間違えた

  • 下記のようなモデルを指定するとき、relation shipには何が入るでしょう。
  • 答えは、ManyTable( )に対して、OneTable( )をJOINするので、 many_to_one です。
  • 初歩の初歩ですが、これを、one_to_many に間違えると何が起きるか?という話です。
explore: ManyTable{
  join:  OneTable{
    relationship: ????★ここ★????
    sql_on: ${ManyTable.joinkey} = ${OneTable.joinkey} ;;
  }
}

Relation Shipって

many_to_one

関係性

  • テーブルの関係性ですね。例えば以下のテーブルMany/Oneを考えると、
  • Many()に対して、 One(1)の関係性なので、多:1(many_to_one)なわけです。

image.png

LEFT JOIN と 件数カウント

  • many_to_oneで、LEFT JOINすると、こんな感じですね。
  • この結合時に、Many側の件数を数えるには、結合した表に対し、単に、count(*) してあげれば良いわけです。
  • 多側が左表、かつ、LEFT JOINなので、count(*)で、A,B,C,D,E⇒5行と数えられます。

image.png

one_to_many

関係性

  • さっきと逆ですね。一般的には、、
  • many_to_oneの多(トランザクション)を左に、1(マスタ)を右に持ってくることが多い気がします。

image.png

LEFT JOIN と 件数カウント

image.png

Relation Ship指定を間違えると

  • 冒頭に記載したとおり、many_to_one(正)と指定すべきところを、one_to_many(誤)と指定すると、
  • LEFT JOINでの件数カウントで、
    • 本当は、count(*) とpkを使わずに件数がカウントできる処理に対して、
    • Lookerは、count(distinct pk) とpkで重複排除をした上でのカウントを実行しようとします。
  • そして、左表側に、主キー(pk) の指定がない場合、下記のようなエラーを出力します。
    • 左表に対して、pkを要求するわけですね。
Field 'ManyTbl Count' cannot be calculated because of a one_to_many or many_to_many join. 
Add a primary key to ManyTbl

よって

  • 初歩の初歩ですが、(当たり前ですが、)
    • Relation Shipを正しく指定する。(備忘の為)、もう一度、model定義を記載します。下記です。
explore: ManyTable{
  join:  OneTable{
    relationship: many_to_one  # Manyに対する、Oneなので、many_to_one
    sql_on: ${ManyTable.joinkey} = ${OneTable.joinkey} ;;
  }
}
  • その上で、
    • 原則、主キーは指定する。
    • RDBMS上、主キーが無い場合、列の組合せで複合主キーが構成できる場合、Looker上でそれを指定。
dimension: compound_primary_key {
  primary_key: yes
  hidden: yes
  type: string
  sql: CONCAT(${TABLE}.primary_key_1, ' ', ${TABLE}.primary_key_2) ;;
}

最後に

  • 初歩の初歩のミスでお恥ずかしいですが、どなたかの役に立てば、、と
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5