ホームページ > データベース > mysql チュートリアル > SQL Server の再帰的自己結合で階層データを効率的に移動するにはどうすればよいですか?

SQL Server の再帰的自己結合で階層データを効率的に移動するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-17 15:31:11
オリジナル
111 人が閲覧しました

How Can Recursive Self-Joins in SQL Server Efficiently Navigate Hierarchical Data?

SQL Server の再帰的自己結合

SQL Server では、再帰的自己結合を使用して、親子関係に基づいてテーブル自体を複数回実行します。

再帰を実行するには自己結合を使用して特定の階層に関連するレコードを取得するには、次の戦略を使用できます:

Common Table Expression (CTE) の使用

CTE (CTE とも呼ばれます)再帰的クエリとして、再帰的自己結合を実装するために使用できます。中心となるアイデアは、特定の基準を満たすレコード (親がないなど) を選択するアンカー クエリを定義し、再帰的サブクエリを使用して結果に子レコードを追加することです。

WITH q AS 
(
    SELECT  *
    FROM    mytable
    WHERE   ParentID IS NULL
    UNION ALL
    SELECT  m.*
    FROM    mytable m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ログイン後にコピー

順序付けを追加することにより、再帰サブクエリに対する条件の場合、ツリーの順序は次のようになります。保存:

WITH    q AS 
(
    SELECT  m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
    FROM    mytable 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    mytable m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc
ログイン後にコピー

考慮事項:

  • アンカー クエリでは、トラバースする階層のルートを表すレコードを選択する必要があります。
  • 再帰的サブクエリは、適切な親子関係を使用して子レコードを親レコードと結合する必要があります
  • 必要に応じて、再帰サブクエリに追加の列を追加して、レベルまたはパスの情報を追跡できます。

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

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