首頁 > 資料庫 > mysql教程 > 如何在SQL Server中執行遞歸自連線來遍歷層次結構資料?

如何在SQL Server中執行遞歸自連線來遍歷層次結構資料?

Susan Sarandon
發布: 2025-01-17 15:41:09
原創
202 人瀏覽過

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

SQL Server遞歸自連線:一種簡易方法

在資料庫管理中,遞歸自連接是一種允許表多次自連接的技術,能夠遍歷層次資料。在SQL Server中,這可以透過遞歸查詢來實現。

考慮以下場景:我們有一個名為「Person」的表,包含以下列:

<code>PersonID | Initials | ParentID</code>
登入後複製

該表表示一個層次結構,其中每個人都有一個「Initials」列,並且可能有一個「ParentID」引用另一個人。

要對「Person」表執行遞歸自連接,我們可以使用如下所示的公用表表達式(CTE):

<code class="language-sql">WITH q AS 
(
    SELECT  *
    FROM    Person
    WHERE   ParentID IS NULL 
    UNION ALL
    SELECT  m.*
    FROM    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q</code>
登入後複製

在這個CTE中:

  1. 初始查詢選擇「ParentID」為NULL的「Person」表中的所有行,代表最終祖先。
  2. CTE的遞迴部分選擇「ParentID」與「q」 CTE中的「PersonID」相符的「Person」表中的行。此步驟有效地擴展了層次結構。
  3. 最終查詢選擇「q」 CTE中的所有行,提供層次資料。

為了保持樹的順序,可以在遞迴查詢中加入排序條件,如下所示:

<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    Person 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    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc</code>
登入後複製

透過更改ORDER BY條件,您可以控制層次結構中同級元素的排序。

以上是如何在SQL Server中執行遞歸自連線來遍歷層次結構資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板