SQLでテーブル結合といえば、異なるテーブルまたはビューとの結合処理のことを指しますが、同一テーブルを結合(自己結合)することも可能です。
利用用途がわかりにくいこともあり、頻繁には利用されていない機能ではありますが、自己結合を使いこなせることでスキルの幅が広がります。
今回はSQLの自己結合について、役割と基本的な使い方をサンプルコードを掲載しながらご紹介していきます。
SQLの自己結合って何?
SQLの自己結合は、1つのテーブルを自分自身と結合する処理のことを指します。
結合といえば、2つ以上のテーブル間で実施される方法が一般的ではありますが、SQLの仕様上、結合元のテーブルと結合先のテーブルが同一テーブルであっても問題ありません。
同一テーブル名・同一カラム名のテーブルが2つあると仮定して、テーブル結合を実施するようなイメージです。
主な利用用途とは
SQLで自己結合を行う主な利用用途としては、「循環リレーションシップ」への対応が挙げられます。
自身のテーブル内に存在する列を、外部キーとして結合させるイメージで利用されます。
自己結合を利用すれば、同一テーブルのデータで新たなテーブルを組み直すようなイメージで、ひと目でデータを確認しやすい構造に作り変えることが可能です。
自己結合の考え方
テーブル結合といえば、「内部結合(INNER JOIN)」「外部結合(OUTER JOIN)」などが挙げられますが、自己結合はこれらの結合とは少し考え方が違います。
自己結合はあくまで1つのテーブルで結合処理を行うということであり、上述した結合の種類は問いません。
つまり自己結合では、1つのテーブルで外部結合や内部結合またはクロス結合を実施するというのが正しい考え方です。
SQLで自己結合する方法
SQLで自己結合を行う基本的な使い方について確認していきましょう。
内部結合
自己結合で内部結合を行う際の記述方法は下記の通りです。
SELECT テーブルの別名.カラム名[, テーブルの別名.カラム名, ....] FROM テーブル名 [AS] 別名1 INNER JOIN テーブル名 [AS] 別名2 ON 別名2.カラム名 = 別名1.カラム名 [WHERE 条件式];
自己結合では同一テーブルを結合するため、必ずテーブルに別名を付与する必要があります。
全く同じテーブルの場合、データベースがどちらのテーブルのデータなのか、自動的に判断することが出来ないためです。
外部結合
自己結合で外部結合を行う際の記述方法は下記の通りです。
SELECT テーブル名.カラム名[, テーブル名.カラム名, ....] FROM テーブル名 [AS] 別名1 LEFT JOIN テーブル名 [AS] 別名2 ON 別名2.カラム名 = 別名1.カラム名 [WHERE 条件式];
SQLの自己結合サンプル
では実際にサンプルSQLで動きの確認を行っていきましょう。
サンプルテーブル
今回サンプルとして「parents」テーブルを下記のデータで作成しています。
+------+--------------------+-----------+ | id | name | couple_id | +------+--------------------+-----------+ | 1 | 山田としお | 4 | | 2 | 佐藤しおり | 5 | | 3 | 伊藤まさし | NULL | | 4 | 山田花子 | 1 | | 5 | 佐藤たかひろ | 2 | +------+--------------------+-----------+
内部結合のサンプル
実際にサンプルテーブルを使用して内部結合の自己結合を実施してみましょう。
SELECT A.id AS ID, A.name AS 名前, B.id AS 配偶者ID, B.name AS 配偶者名 FROM parents A INNER JOIN parents B ON B.id = A.couple_id;
実行した結果が下記の通りです。
+------+--------------------+-------------+--------------------+ | ID | 名前 | 配偶者ID | 配偶者名 | +------+--------------------+-------------+--------------------+ | 4 | 山田花子 | 1 | 山田としお | | 5 | 佐藤たかひろ | 2 | 佐藤しおり | | 1 | 山田としお | 4 | 山田花子 | | 2 | 佐藤しおり | 5 | 佐藤たかひろ | +------+--------------------+-------------+--------------------+
同一テーブルですが、テーブル結合により表示内容を変更したことで、一見してデータを確認しやすくなりました。
外部結合のサンプル
全く同じサンプルデータを今度は外部結合の自己結合で動作確認してみましょう。
SELECT A.id AS ID, A.name AS 名前, B.id AS 配偶者ID, B.name AS 配偶者名 FROM parents A LEFT JOIN parents B ON B.id = A.couple_id;
実行した結果が下記の通りです。
+------+--------------------+-------------+--------------------+ | ID | 名前 | 配偶者ID | 配偶者名 | +------+--------------------+-------------+--------------------+ | 4 | 山田花子 | 1 | 山田としお | | 5 | 佐藤たかひろ | 2 | 佐藤しおり | | 1 | 山田としお | 4 | 山田花子 | | 2 | 佐藤しおり | 5 | 佐藤たかひろ | | 3 | 伊藤まさし | NULL | NULL | +------+--------------------+-------------+--------------------+
外部結合ですので、軸となるテーブル情報が全て取得された上で、存在しないデータに関してはNULLが表示されています。
さいごに:SQLの自己結合は知識として把握しておこう
本記事では、SQLの自己結合について、考え方と使い方をご紹介してきました。
実務において、自己結合が利用されている場面はあまり見かけませんが、知識としては知っておきたい内容です。
自己結合については、SQLの経験が浅い状態の方ほど、内部結合や外部結合と同列で考えてしまいがちですが、同一テーブルでも結合処理を行うことが出来るとだけ認識しておけば、シンプルに考えやすいかと思います。
記事内で掲載するサンプルコードはMySQLデータベースを利用して動作検証しております。
データベースによっては実行出来ない可能性もありますのでご認識ください。