![見出し画像](https://assets.st-note.com/production/uploads/images/78435691/rectangle_large_type_2_6706e08b432ed0c7865d78308d80df58.png?width=1200)
【Airtable】同じテーブル同士でリレーションシップ!?「自己結合」の話
ほい、本日もAirtableとSQLを比較してまいります。本日は、再びリレーションシップの話でございます~。
リレーションシップの話は、過去記事でガッツリ取り上げましたが、今回は、その応用編です。ある一つのテーブルを、また同一のそのテーブルとリレーションシップしてしまおうというお話です。
「あ~、これまた、何言っちゃってるの!?😭」
ナイス☆突っ込みです…😉。1つのテーブルが、まるで「2つ存在する」とみなして、2つのテーブル間でリレーションシップを設定したのと同様な結果を得よう、ということです。
こんな不思議なことを、Airtableなら、、、できます!しかも割と簡単に!もちろんSQLでもできます(「自己結合」といいます)ので、それも確認しましょう。
まだ、分かりにくい!?実例を見てもらった方が早いですね。早速いきましょう😄。
Airtableの場合
定番サンプル「従業員リスト」
はい、サンプルとして使いますテーブルは、「従業員」リストです。自己結合サンプルの「定番中の定番」です。なぜって、上司と部下の関係が分かりやすいからでしょうね。同じテーブルの中で「1対多」の関係が存在していいる典型です。
さて、下の「従業員」リストを見てみましょう。従業員には「上司」がおり、「誰が上司か」を「上司コード」列で管理しています。「上司コード」の値は、上司の「従業員コード」です。ここまでOK?
![](https://assets.st-note.com/img/1652386497080-troPgziwHn.png)
ある従業員の上司が誰かを知るのに、「従業員コード」ではイマイチよく分かりません💦。少なくとも「上司名」くらい同一の行に表示させたい、もしフィールドがあるなら、「上司の内線番号」「上司の役職名」も、それぞれの従業員の行に表示できたらいいな…。
はい、それをかなえるのが同一テーブル間でのリレーションシップです!今回は簡略化のため「上司名」だけ取得してみましょう!
Link to Another Recordフィールドで設定
では、リレーションシップを設定します。キーになるのは、「上司コード」ですね。これを上司の「従業員コード」と紐づけます。
上司コードの列タイトルをクリックして、フィールド型をLink to Another Recordに変えてください。
![](https://assets.st-note.com/img/1652386554545-ITARJpZGrO.png)
Linkさせるテーブルを選択します。現在、Baseには、一つのテーブルしかございません。そう、今まさに編集中のテーブルを選択するのです!
![](https://assets.st-note.com/img/1652386664708-fa8xSryc2E.png)
リンク先のテーブルから、一つのレコードを紐づけます。部下にとって上司は一人(と仮定)なので、MultipleはOFFでいいでしょう。
![](https://assets.st-note.com/img/1652386708031-5Ct1aSvVlF.png)
続いて、Lookupフィールドを作ります。今は上司の名前くらいしか取れないので、「従業員名」だけにしておきましょう。
![](https://assets.st-note.com/img/1652386756844-pPp31fvVkd.png)
はい、テーブル内リレーションシップ(自己結合)が完成しました~😆。
![](https://assets.st-note.com/img/1652386806906-HknyEeJHxO.png?width=1200)
あ、列見出しは、分かりにくいので、やはり変更しておきました。「上司名」でいいかな。
![](https://assets.st-note.com/img/1652387001928-m2RfnHHocV.png)
やった~。自己結合できたぞ~。で、SQLでは、どうやるんでしょう。
SQLの場合
はい、SQLでも同じ表操作をしてみましょう。下の画像のとおり、Airtableと同じデータを準備しました。
![](https://assets.st-note.com/img/1652386876812-QWdGsLj6K0.png)
上のビューを得るためのSQL文は、次の通りです。テーブル名は、「従業員名簿」で、すべての列を取得しています。
![](https://assets.st-note.com/img/1652387565303-j8yAht0krO.png)
ここまで確認できたら、リレーションシップ(表結合)してみましょう!
使うのは、外部結合Left outer join
作ったSQL文は次の通りです。
![](https://assets.st-note.com/img/1652387507205-r8g6Vk4se0.png?width=1200)
From句に着目しましょう。同じテーブルで左外部結合していますね!ただし、別名(XとY)の設定をすることによって、2つのテーブルを区別しているんですね。
もしこれを「内部結合」(キーの値が一致した行のみ取得)したらどうなります?そう、上司がいない人(山田さんと、田中さん)の行が取得できません。一応、全員分のレコードが欲しいので、左外部結合にしてあるんですね。
さらに、On句を見てみます。全行取得としたXの方は、上司コードを指定、上司のデータを提供するYは、従業員コードを指定しています。
結果は、こちら。無事、上司名を自らのテーブルから取得できましたね~。
![](https://assets.st-note.com/img/1652387393576-G26T8zLVAp.png)
これで、めでたくSQLでもできました。SQLで書くと結構ややこしいですが、Airtableではあっさりできましたね。自己結合とか、聞きなれない単語を覚える必要もないし。よくできています。
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。