首頁 >資料庫 >mysql教程 >SQL Server 中的遞歸自連線如何有效地導覽分層資料?

SQL Server 中的遞歸自連線如何有效地導覽分層資料?

Patricia Arquette
Patricia Arquette原創
2025-01-17 15:31:11114瀏覽

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

SQL Server 中的遞歸自連線

在SQL Server 中,遞歸自連線可讓您透過連線基於父子關係​​多次將表連接到自身。

執行遞歸自連接檢索與特定層次結構相關的記錄,可以採用以下策略:

使用公共表表達式(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

CTE,也稱為遞歸查詢,可用於實現遞歸自連線。核心思想是定義一個錨查詢,選擇滿足特定條件(例如,沒有父記錄)的記錄,然後使用遞歸子查詢將子記錄附加到結果中:

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn