掌握 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中文網其他相關文章!