ホームページ > データベース > mysql チュートリアル > SQL Server で再帰的自己結合を使用して階層データの祖先を表示する方法

SQL Server で再帰的自己結合を使用して階層データの祖先を表示する方法

Barbara Streisand
リリース: 2025-01-15 11:15:44
オリジナル
532 人が閲覧しました

How to Use Recursive Self-Join in SQL Server to Display Hierarchical Data Ancestors?

SQL Server で再帰的自己結合を使用して階層データを表すヒント

Id、Name、および ParentId 列を含む「カテゴリー」というテーブルがあり、カテゴリー内に無制限の階層を作成できるとします。ビジネス ラップトップ カテゴリとそのすべての祖先カテゴリを表示するには、再帰共通テーブル式 (CTE) の機能を利用できます。

サンプルの「カテゴリ」テーブルを作成し、ソリューションを説明するためにデータを入力してみましょう:

<code class="language-sql">DECLARE @Categories AS TABLE
(
    Id INT,
    Name VARCHAR(100),
    ParentId INT
);

INSERT INTO @Categories VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4);</code>
ログイン後にコピー

次に、「PathFinder」と呼ばれる再帰的 CTE を作成して、親子関係を反復し、祖先名を「Path」列に連結します。

<code class="language-sql">WITH PathFinder AS
(
    SELECT Id, Name, Name AS Path, ParentId
    FROM @Categories 
    WHERE ParentId IS NULL
    UNION ALL
    SELECT t.Id, t.Name, CAST(cf.Path + ', ' + t.Name AS VARCHAR(100)), t.ParentId
    FROM @Categories t
    INNER JOIN PathFinder cf ON t.ParentId = cf.Id
)</code>
ログイン後にコピー

最後に、PathFinder CTE を使用して、「ビジネス ラップトップ」カテゴリの名前とその祖先を取得できます。

<code class="language-sql">SELECT Name, Path
FROM PathFinder
WHERE Name = 'Business Laptops';</code>
ログイン後にコピー

このクエリは、カテゴリ名とその祖先をカンマで区切って返します。

再帰クエリの内訳は次のとおりです:

  • 基本ケース: CTE の最初の部分は、親のないカテゴリ (つまり、ルート ノード) を選択し、その名前でその「パス」を初期化します。
  • 再帰的なケース: 2 番目の部分は、カテゴリを親に再帰的に結合し、その名前を「パス」列に追加します。このプロセスは、未処理のカテゴリがなくなるまで継続されます。
  • 結果: CTE は、各行がカテゴリとその完全な祖先を表す一連の行を生成します。この CTE から必要なカテゴリ名を選択することで、必要なデータを取得できます。

この再帰的アプローチを使用すると、SQL Server で階層データを効率的に表現し、クエリを実行できます。これは、固有の関係を持つデータを管理および分析するための貴重な手法となります。

以上がSQL Server で再帰的自己結合を使用して階層データの祖先を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート