首页 > 数据库 > mysql教程 > 如何在 SQL Server 中使用递归自连接检索类别及其祖先?

如何在 SQL Server 中使用递归自连接检索类别及其祖先?

DDD
发布: 2025-01-15 11:44:44
原创
400 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板