導航分層資料結構可能很複雜。 SQL Server 的遞歸公用資料表運算式 (CTE) 為使用自聯接遍歷這些樹狀結構提供了強大的解決方案。
考慮一個典型的分層資料模型,例如類別表:
<code class="language-sql">CREATE TABLE Categories ( Id int PRIMARY KEY, Name nvarchar(MAX), ParentId int FOREIGN KEY REFERENCES Categories(Id) );</code>
這種設計允許任意深度的巢狀類別。 可視化此層次結構(如下所示)突顯了使用標準 SQL 查詢檢索完整譜系的難度。
[插入類別層次結構影像]
遞歸 CTE 優雅地解決了這個問題。以下查詢示範如何擷取類別及其整個祖先:
<code class="language-sql">WITH RecursiveCategoryCTE AS ( SELECT c.Id, c.Name, CAST(c.Name AS nvarchar(MAX)) AS Path FROM Categories AS c WHERE c.ParentId IS NULL UNION ALL SELECT t.Id, t.Name, CAST(r.Path + ',' + t.Name AS nvarchar(MAX)) AS Path FROM RecursiveCategoryCTE AS r JOIN Categories AS t ON t.ParentId = r.Id ) SELECT c.Id, c.Name, c.Path FROM RecursiveCategoryCTE AS c WHERE c.Name = 'Business Laptops';</code>
RecursiveCategoryCTE
先選擇根類別(其中 ParentId
為 NULL)。 Categories
表,建構 Path
欄位來累積祖先名稱。 SELECT
語句過濾目標類別(「商務筆記型電腦」)及其產生的祖先路徑。 結果將是:
Id | Name | Path |
---|---|---|
12 | Business Laptops | Computers,Laptops,Business Laptops |
這項技術在許多應用中都很有價值,包括:
這種方法提供了一種簡潔且有效率的方法來在 SQL Server 中導航分層資料。
以上是SQL Server中的遞歸自連線如何有效率地檢索分層資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!