ただし、SQL には自己結合として知られる、目立たないタイプの結合があります。
SQL では、自己結合は、同じテーブル内の関連する列に基づいて同じテーブルの行を結合できる強力な手法です。
複数のテーブルからデータを取得する SQL の他のタイプの結合とは異なり、自己結合は単一のテーブルに対して機能します。
テーブル自体からデータを検索できるのに、なぜ自己結合が必要なのか疑問に思うかもしれません。それは真実かもしれませんが、再帰的なデータ クエリを実行したり、階層データを検索したりする必要がある場合、自己結合はタスクに役立ちます。
基本的に、自己結合は、同じテーブルの行を比較する必要がある場合に基本的な役割を果たします。
この投稿では、自己結合とは何か、その仕組み、SQL テーブルでの使用方法について説明します。
注: 説明に入る前に、デモンストレーション用に基本的なテーブルをセットアップします。ただし、サポートされているデータセットであればどれでも使用できます。
サンプルデータ
次のクエリは、製品情報を含む基本テーブルを作成し、サンプル レコードをテーブルに挿入します。これにより、SQL で自己結合を操作する方法を示すことができます。
CREATE TABLE 製品 (product_id INT 主キー、
製品名 VARCHAR(255) NOT NULL、
親 ID INT
);
10 個のサンプル レコードをテーブルに追加します。
製品 (product_id、product_name、parent_id) の値に挿入(1、「エレクトロニクス」、NULL)、
(2、「スマートフォン」、1)、
(3、「ラップトップ」、1)、
(4、「iPhone 13」、2)、
(5、「Samsung Galaxy S21」、2)、
(6、「MacBook Pro」、3)、
(7、「Dell XPS 15」、3)、
(8、「アクセサリ」、NULL)、
(9、「電話ケース」、8)、
(10、「ラップトップ バッグ」、8);
結果のテーブルは次のとおりです。
例 1: 基本的な自己結合
基本的な自己結合から始めましょう。たとえば、単純な自己結合を使用して、同じテーブルの親子関係を取得できます。
たとえば、これを使用して、すべての製品とそれに対応する親製品を検索できます。次のようにクエリを実行できます。
SELECT c.product_name AS child_product、p.product_name ASparent_productFROM製品c
LEFT JOIN 製品 p ON c.parent_id = p.product_id;
指定されたクエリ例では、子製品を表す製品テーブルのエイリアスとして「c」を使用します。
また、親製品を表す製品テーブルの「p」エイリアスも作成します。
次のステップでは、基本的な SQL LEFT JOIN を使用して、トップレベルの製品が結果に含まれるようにします。
最後に、ON 句を使用して、「parent_id」列と「product_id」列を使用して子レコードと親レコード間の関係を作成します。
結果のテーブルは次のとおりです。
親製品はルート要素とも呼ばれる階層の最上位にあるため、トップ リンクがないことがわかります。
例 2: 階層データのフェッチ
自己結合の最も基本的な役割の 1 つは、階層データを取得することです。たとえば、製品が「アクセサリ」に等しいすべての子製品を取得するとします。次のように自己結合を使用してクエリを実行できます。
SELECT c.product_name AS child_productFROM製品c
JOIN 製品 p ON c.parent_id = p.product_id
WHERE p.product_name = 'アクセサリ';
この場合、JOIN を使用して products テーブルをそれ自体と結合し、次に WHERE 句を使用して必要な結果をフィルタリングします。
結論
このチュートリアルでは、自己結合とは何か、その仕組み、およびそれを SQL テーブルで使用して階層データを取得したり再帰クエリを実行したりする方法について説明しました。