首頁 > 資料庫 > mysql教程 > 如何在SQL Server中使用遞歸自連線來顯示分層資料祖先?

如何在SQL Server中使用遞歸自連線來顯示分層資料祖先?

Barbara Streisand
發布: 2025-01-15 11:15:44
原創
572 人瀏覽過

How to Use Recursive Self-Join in SQL Server to Display Hierarchical Data Ancestors?

SQL Server中使用遞歸自連線表示層次資料的技巧

假設您有一個名為「Categories」的資料表,包含Id、Name和ParentId列,允許在類別中建立無限層次結構。為了顯示「Business Laptops」類別及其所有祖先類別,您可以利用遞歸公共表格運算式 (CTE) 的強大功能。

讓我們建立一個範例「Categories」表格並填入資料來說明解決方案:

<code class="language-sql">DECLARE @Categories AS TABLE
(
    Id INT,
    Name VARCHAR(100),
    ParentId INT
);

INSERT INTO @Categories VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4);</code>
登入後複製

接下來,我們建立一個名為「PathFinder」的遞歸CTE來遍歷父子關係,並將祖先名稱連接到「Path」列:

<code class="language-sql">WITH PathFinder AS
(
    SELECT Id, Name, Name AS Path, ParentId
    FROM @Categories 
    WHERE ParentId IS NULL
    UNION ALL
    SELECT t.Id, t.Name, CAST(cf.Path + ', ' + t.Name AS VARCHAR(100)), t.ParentId
    FROM @Categories t
    INNER JOIN PathFinder cf ON t.ParentId = cf.Id
)</code>
登入後複製

最後,我們可以使用PathFinder CTE來擷取「Business Laptops」類別的名稱及其祖先:

<code class="language-sql">SELECT Name, Path
FROM PathFinder
WHERE Name = 'Business Laptops';</code>
登入後複製

此查詢將傳回類別名稱及其祖先,祖先名稱之間以逗號分隔。

以下是遞迴查詢的細分:

  • 基本情況: CTE的第一部分選擇沒有父級的類別(即根節點),並使用其名稱初始化其「Path」。
  • 遞歸情況: 第二部分將類別遞歸地與其父級連接,並將它們的名稱附加到「Path」列。此過程將持續進行,直到沒有更多未處理的類別為止。
  • 結果: CTE產生一系列行,每行代表一個類別及其完整的祖先。透過從此CTE中選擇所需的類別名稱,我們可以檢索所需的資料。

使用這種遞歸方法,您可以有效地在SQL Server中表示和查詢層次數據,這為管理和分析具有固有關係的數據提供了一種寶貴的技術。

以上是如何在SQL Server中使用遞歸自連線來顯示分層資料祖先?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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