【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ではあっさりできましたね。自己結合とか、聞きなれない単語を覚える必要もないし。よくできています。
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。