ホームページ > データベース > mysql チュートリアル > SQL Server で再帰的自己結合を実行して階層データを横断するにはどうすればよいですか?

SQL Server で再帰的自己結合を実行して階層データを横断するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-17 15:41:09
オリジナル
202 人が閲覧しました

How Can I Perform Recursive Self-Joins in SQL Server to Traverse Hierarchical Data?

SQL Server の再帰的自己結合: 簡単な方法

データベース管理において、再帰的自己結合は、テーブルが複数回自己結合できるようにするテクノロジーであり、階層データを横断することができます。 SQL Server では、これは再帰クエリによって実現できます。

次のシナリオを考えてみましょう: 次の列を持つ「person」というテーブルがあります:

<code>PersonID | Initials | ParentID</code>
ログイン後にコピー

このテーブルは階層を表しており、各人物には「Initials」列があり、別の人を参照する「ParentID」を持つ可能性があります。

「person」テーブルで再帰的自己結合を実行するには、以下に示すように共通テーブル式 (CTE) を使用できます。

<code class="language-sql">WITH q AS 
(
    SELECT  *
    FROM    Person
    WHERE   ParentID IS NULL 
    UNION ALL
    SELECT  m.*
    FROM    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q</code>
ログイン後にコピー

この CTE:

  1. 最初のクエリは、「ParentID」が NULL であり、最終的な祖先を表す「person」テーブル内のすべての行を選択します。
  2. CTE の再帰部分は、「ParentID」が「q」CTE の「PersonID」と一致する「Person」テーブル内の行を選択します。このステップにより、階層が効果的に拡張されます。
  3. 最後のクエリは、「q」CTE 内のすべての行を選択し、階層データを提供します。

ツリーの順序を維持するために、次のように再帰クエリに並べ替え条件を追加できます。

<code class="language-sql">WITH q AS 
(
    SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
    FROM    Person m
    WHERE   ParentID IS NULL
    UNION ALL
    SELECT  m.*,  q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
    FROM    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc</code>
ログイン後にコピー

ORDER BY 条件を変更することで、階層内の兄弟要素の順序を制御できます。

以上がSQL Server で再帰的自己結合を実行して階層データを横断するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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