階層データのための 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 サイトの他の関連記事を参照してください。