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

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

Linda Hamilton
リリース: 2025-01-17 15:37:08
オリジナル
422 人が閲覧しました

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

階層データのための SQL Server での再帰的自己結合をマスターする

再帰的自己結合は、SQL Server テーブル内の階層データ構造をナビゲートするために不可欠です。 この手法は、組織図や家系図など、親子関係で整理されたデータを扱う場合に特に役立ちます。

再帰的自己結合への簡単なアプローチでは、共通テーブル式 (CTE) を使用します。

<code class="language-sql">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;</code>
ログイン後にコピー

このクエリは再帰 CTE、q を定義します。 最初の SELECT ステートメントは、ルート ノード (ParentID が NULL であるノード) を識別します。 UNION ALL は、これを後続の SELECT ステートメントと組み合わせて、CTE を mytable と再帰的に結合してすべての子孫を含めます。最後の SELECT ステートメントは、完全な階層データセットを取得します。

階層順序の維持

元の階層構造と順序を保持するには、変更されたクエリが必要です。

<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 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;</code>
ログイン後にコピー

この強化されたクエリは、bc を使用して ROW_NUMBER() 列を追加し、一意の識別子を割り当て、階層の各レベル内の順序を維持します。 ORDER BY bc 句は、最終結果が元のツリー構造を反映していることを保証します。 ORDER BY 関数内の ROW_NUMBER() 句を調整すると、兄弟ノードの順序をカスタマイズできます。

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

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