首頁 >資料庫 >mysql教程 >如何在 SQL Server 中使用遞歸自連線檢索類別及其祖先?

如何在 SQL Server 中使用遞歸自連線檢索類別及其祖先?

DDD
DDD原創
2025-01-15 11:44:44401瀏覽

How to Retrieve a Category and Its Ancestors Using Recursive Self-Join in SQL Server?

在 SQL Server 中使用遞歸自連線來擷取類別及其祖先

本文示範如何使用遞歸自連線從 SQL Server 中的分層表中擷取類別及其祖先類別。 我們將使用通用表表達式 (CTE) 來完成此任務。

場景:

考慮一個 Categories 表,其中 IdNameParentId 欄位表示分層類別結構。 目標是編寫一個查詢,以單一逗號分隔的字串傳回特定類別(例如「商務筆記型電腦」)及其所有父類別。

遞歸 CTE 解:

此解決方案採用遞歸 CTE 來遍歷層次結構。 這是查詢:

<code class="language-sql">WITH CategoryHierarchy AS (
    SELECT id, name, CAST(name AS VARCHAR(MAX)) AS path, parent_id
    FROM Categories
    WHERE parent_id IS NULL  -- Start with root categories
    UNION ALL
    SELECT c.id, c.name, CAST(ch.path + ',' + c.name AS VARCHAR(MAX)), c.parent_id
    FROM Categories c
    INNER JOIN CategoryHierarchy ch ON c.parent_id = ch.id
)</code>

此 CTE CategoryHierarchy 遞歸地將 Categories 表與其自身連接起來。初始的 SELECT 語句選擇根類別(parent_id 為 NULL 的類別)。 UNION ALL 將其與後續的遞歸選擇結合,透過連接父類別名稱和子類別名稱來建構 path 字串。

擷取特定類別和祖先的查詢:

要擷取「商務筆記型電腦」類別及其祖先:

<code class="language-sql">SELECT id, name, path
FROM CategoryHierarchy
WHERE name = 'Business Laptops';</code>

範例表格與資料:

讓我們建立一個範例 Categories 表並插入一些資料:

<code class="language-sql">CREATE TABLE Categories (
    Id INT PRIMARY KEY,
    Name VARCHAR(100),
    ParentId INT REFERENCES Categories(Id)
);

INSERT INTO Categories (Id, Name, ParentId)
VALUES
(1, 'Electronics', NULL),
(2, 'Laptops', 1),
(3, 'Desktops', 1),
(4, 'Business Laptops', 2),
(5, 'Gaming Laptops', 2);</code>

預期結果:

針對「商務筆記型電腦」的查詢,預期輸出為:

<code>id      name                path
4       Business Laptops     Electronics,Laptops,Business Laptops</code>

這種方法使用遞歸 CTE 有效地檢索類別及其完整譜系,為在 SQL Server 中導航分層資料提供了清晰高效的解決方案。 如果您的類別名稱可能超出此限制,請記住調整 VARCHAR(MAX) 長度。

以上是如何在 SQL Server 中使用遞歸自連線檢索類別及其祖先?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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