見出し画像

【Airtable】同じテーブル同士でリレーションシップ!?「自己結合」の話

ほい、本日もAirtableとSQLを比較してまいります。本日は、再びリレーションシップの話でございます~。

リレーションシップの話は、過去記事でガッツリ取り上げましたが、今回は、その応用編です。ある一つのテーブルを、また同一のそのテーブルとリレーションシップしてしまおうというお話です。

「あ~、これまた、何言っちゃってるの!?😭」

ナイス☆突っ込みです…😉。1つのテーブルが、まるで「2つ存在する」とみなして、2つのテーブル間でリレーションシップを設定したのと同様な結果を得よう、ということです。

こんな不思議なことを、Airtableなら、、、できます!しかも割と簡単に!もちろんSQLでもできます(「自己結合」といいます)ので、それも確認しましょう。

まだ、分かりにくい!?実例を見てもらった方が早いですね。早速いきましょう😄。

Airtableの場合

定番サンプル「従業員リスト」

はい、サンプルとして使いますテーブルは、「従業員」リストです。自己結合サンプルの「定番中の定番」です。なぜって、上司と部下の関係が分かりやすいからでしょうね。同じテーブルの中で「1対多」の関係が存在していいる典型です。

さて、下の「従業員」リストを見てみましょう。従業員には「上司」がおり、「誰が上司か」を「上司コード」列で管理しています。「上司コード」の値は、上司の「従業員コード」です。ここまでOK?

ある従業員の上司が誰かを知るのに、「従業員コード」ではイマイチよく分かりません💦。少なくとも「上司名」くらい同一の行に表示させたい、もしフィールドがあるなら、「上司の内線番号」「上司の役職名」も、それぞれの従業員の行に表示できたらいいな…。

はい、それをかなえるのが同一テーブル間でのリレーションシップです!今回は簡略化のため「上司名」だけ取得してみましょう!

Link to Another Recordフィールドで設定

では、リレーションシップを設定します。キーになるのは、「上司コード」ですね。これを上司の「従業員コード」と紐づけます。

上司コードの列タイトルをクリックして、フィールド型をLink to Another Recordに変えてください。

Linkさせるテーブルを選択します。現在、Baseには、一つのテーブルしかございません。そう、今まさに編集中のテーブルを選択するのです!

リンク先のテーブルから、一つのレコードを紐づけます。部下にとって上司は一人(と仮定)なので、MultipleはOFFでいいでしょう。

続いて、Lookupフィールドを作ります。今は上司の名前くらいしか取れないので、「従業員名」だけにしておきましょう。

はい、テーブル内リレーションシップ(自己結合)が完成しました~😆。

あ、列見出しは、分かりにくいので、やはり変更しておきました。「上司名」でいいかな。

やった~。自己結合できたぞ~。で、SQLでは、どうやるんでしょう。

SQLの場合

はい、SQLでも同じ表操作をしてみましょう。下の画像のとおり、Airtableと同じデータを準備しました。

上のビューを得るためのSQL文は、次の通りです。テーブル名は、「従業員名簿」で、すべての列を取得しています。

ここまで確認できたら、リレーションシップ(表結合)してみましょう!

使うのは、外部結合Left outer join

作ったSQL文は次の通りです。

From句に着目しましょう。同じテーブルで左外部結合していますね!ただし、別名(XとY)の設定をすることによって、2つのテーブルを区別しているんですね。

もしこれを「内部結合」(キーの値が一致した行のみ取得)したらどうなります?そう、上司がいない人(山田さんと、田中さん)の行が取得できません。一応、全員分のレコードが欲しいので、左外部結合にしてあるんですね。

さらに、On句を見てみます。全行取得としたXの方は、上司コードを指定、上司のデータを提供するYは、従業員コードを指定しています。

結果は、こちら。無事、上司名を自らのテーブルから取得できましたね~。

これで、めでたくSQLでもできました。SQLで書くと結構ややこしいですが、Airtableではあっさりできましたね。自己結合とか、聞きなれない単語を覚える必要もないし。よくできています。

では、ビーダゼーン!

※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。



この記事が気に入ったらサポートをしてみませんか?