【Airtable】「表結合」には4つのパターンがある
前回記事まで、Airtableのリレーションシップの設定方法を解説しました。Aという表が、リレーションシップの相手であるB表にある『列』を取得できるようになるのは、便利ですね~😄。
しかし、「リレーションシップを設定することで、どんな『行』を得られるのか」についてきちんと考えていませんでした💦。
本来、AとBという表を結合させたのであれば、結合条件となる列(キー)の値に応じて、得られる「『行』のパターン」にはいくつかあるはずです。
例えば、次のパターンがあるはずです。
AとBのキーの値が一致した行のみ取り出す。【内部結合】
Aは、キーに値があるすべての行を取り出すが、Bは、Aの値に対応する値が存在する行だけ取り出す。【外部結合】
Bは、キーに値があるすべての行を取り出すが、Aは、Bの値に対応する値が存在する行だけ取り出す。【外部結合】
AもBもキーに値がある限り、いずれの表からもすべての行を取り出す。【全外部結合】
果たして、私たちは、前回記事までの作業で、いったいどのパターンの行を取得したのでしょうか?これが分かれば、「リレーションシップの設定はできたけど、『行』を連結させているのか、イマイチ腹落ちせず、気持ち悪いな、、、😅」という状態から抜け出せます!
ということで、SQLも使いながらAirtableのリレーションシップで、どのように「行」が取得されているか見てみましょう!
内部結合したら、どんな行を取得できるの?
まずは、表結合一つめのパターンとして、「内部結合」を見てみることにしましょう。
厳密な定義はさせておき、上述のように、「内部結合」では、2つの表のキーの値が一致した行のみ取り出します。果たして、Airtableでリレーションシップを設定すると、「内部結合」による結果が得られるのでしょうか?
SQLサーバ上に、Airtableと同じデータを準備しましたから、SQLで試してみます。SQLなら、いろんなデータの取り出し方ができますからね!
叩いたSQL文は、こちらです。
Select句で取り出す列を指定します。どの担当者がどの得意先を担当しているかを確認することを意図しています。
Where句で、連結する2つのキーを指定しています。このように書くと、2つの表(「担当者X」と「担当者Y」)が、連結キーにより内部結合します。
担当者ごとに担当の得意先を確認したいので、担当者コード順にしました。
出力結果はこちらです。これが内部結合の結果とご理解ください。
これをAirtableの「担当者テーブル」と比較しますよ。
取り出した行の違いにご注目ください。何が違いますか?
Airtableの方は、
1)太田さんの行が存在する。
2)山本さんは、2社を担当しているが1行にまとめられている。
というところですね。ここに着目しますよ!
誰も担当してない人も表示されている
太田さんはどの得意先も担当していません。すなわち、得意先テーブルの担当者コード列に太田さんのコード(103)がありません。
それでも、太田さんがの行が残っているということは、、、Airtableの「担当者テーブル」のこのビューは、「内部結合」ではない!ということが確定しました😆!
じゃあ、なんなの?という話は次回に譲ります。次のセクションは、余談になりますが、大事だと思いますので、少し触れます。
山本さんが1行にまとめられれているのは、問題ないのか?
山本さんは、A社とE社の担当者です(きっと優秀なんでしょうね)。これは、SQLでは次のように2行で取得できました。
一方、Airtableでは、次のように1行にまとめられています。
この違いは、どう受け止められばいいんのでしょうか?
実は、Airtableのような行の表示の仕方は、データベース的には、「気持ち悪い」のです。
データベースでは、同じセル内に2つの値を入れない(横方向にデータを繰り消し増やさない)のがお約束です。ですから、SQLの方は、2行に分けて表示してくれています。2行に分けるということは、縦方向にデータが増えて見えるのですが、横方向に増えて表示されるよりマシです。
とはいえ、Airtableの方は、あくまでデータベースの「ビュー」であり、Lookupフィールドや、Link to Another Recordフィールドは、値の実体を持っているわけではないので、使いやすいならこれでいいのでしょう(他方、データを格納するときに、セルに2つ以上の値を持たせるのはやめましょう。非正規形となってしまいます。)
はい、本日は以上です。まずは、Airtableのビューが「内部結合ではない」、ということを確認できました~。
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。