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