首頁 >資料庫 >mysql教程 >SQL Server 中的遞迴 CTE 如何擷取類別及其祖先路徑?

SQL Server 中的遞迴 CTE 如何擷取類別及其祖先路徑?

Susan Sarandon
Susan Sarandon原創
2025-01-15 11:30:44517瀏覽

How Can Recursive CTEs in SQL Server Retrieve a Category and its Ancestor Path?

SQL Server中使用遞迴公用資料表運算式(CTE)的自參考查詢

簡介

在關聯式資料庫中,自引用查詢是一種強大的技術,用於遍歷單一表中的層次關係。 SQL Server為此目的提供了公用表格運算式(CTE),從而實現高效且表達式強的遞迴查詢。

問題

考慮一個簡化的「類別」表,其中包含ID、名稱和ParentId列。此表支援類別的不確定層次結構,如下面的範例所示:

<code>Id     Name       ParentId
1      Business   NULL
2      Laptops    1
3      Asus       2</code>

目標是建構一個查詢,該查詢不僅檢索指定的類別(例如,「商務筆記型電腦」),而且還提供其所有父類別的逗號分隔清單。

解:遞迴CTE

為了解決這個問題,可以使用遞迴CTE。最外層的CTE定義遞歸的起點,而遞迴項定義擴展層次結構的邏輯:

<code>WITH CTE AS (
    SELECT Id, Name, Name AS Path, ParentId
    FROM Categories 
    WHERE ParentId IS NULL
    UNION ALL
    SELECT t.Id, t.Name, cast(cte.Path + ',' + t.Name as varchar(100)), t.ParentId
    FROM Categories t
    INNER JOIN CTE ON t.ParentId = CTE.Id
)</code>

查詢

為了檢索指定的類別及其父類別,我們使用一個簡單的查詢:

<code>SELECT Id, Name, Path
FROM CTE
WHERE Name = 'Business Laptops'</code>

結果

查詢傳回以下結果:

<code>Id     Name       Path
2      Laptops    Business,Laptops</code>

在此範例中,「商務筆記型電腦」是「筆記型電腦」的子項,「筆記型電腦」是「商務」的子項。 「路徑」列提供了返回根類別的完整層次路徑。

結論

SQL Server中的遞歸CTE提供了一種優雅且有效率的方法來導覽表中的層次關係。透過利用遞歸的強大功能,可以建構複雜的查詢以從層次資料結構中提取有價值的見解。

以上是SQL Server 中的遞迴 CTE 如何擷取類別及其祖先路徑?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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