首頁 >資料庫 >mysql教程 >SQL Server中的遞歸自連線如何有效率地檢索分層資料?

SQL Server中的遞歸自連線如何有效率地檢索分層資料?

Barbara Streisand
Barbara Streisand原創
2025-01-15 12:01:47224瀏覽

How Can Recursive Self-Joins in SQL Server Efficiently Retrieve Hierarchical Data?

在 SQL Server 中透過遞歸自連線高效檢索分層資料

導航分層資料結構可能很複雜。 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 解

遞歸 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>

查詢細分

  • CTE RecursiveCategoryCTE 先選擇根類別(其中 ParentId 為 NULL)。
  • 它遞歸地連接回 Categories 表,建構 Path 欄位來累積祖先名稱。
  • 最終的 SELECT 語句過濾目標類別(「商務筆記型電腦」)及其產生的祖先路徑。

結果將是:

Id Name Path
12 Business Laptops Computers,Laptops,Business Laptops

實際應用

這項技術在許多應用中都很有價值,包括:

  • 組織架構圖
  • 電子商務網站導航(麵包屑路徑)
  • 家譜資料庫(家譜)

這種方法提供了一種簡潔且有效率的方法來在 SQL Server 中導航分層資料。

以上是SQL Server中的遞歸自連線如何有效率地檢索分層資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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