首页 > 数据库 > mysql教程 > 如何在 SQL Server 中执行递归自连接来探索分层数据?

如何在 SQL Server 中执行递归自连接来探索分层数据?

Linda Hamilton
发布: 2025-01-17 15:37:08
原创
422 人浏览过

How Can I Perform Recursive Self-Joins in SQL Server to Explore Hierarchical Data?

掌握 SQL Server 中分层数据的递归自连接

递归自连接对于在 SQL Server 表中导航分层数据结构至关重要。 当处理以父子关系组织的数据(例如组织图表或家谱)时,此技术特别有用。

递归自连接的直接方法使用公共表表达式 (CTE):

<code class="language-sql">WITH q AS (
    SELECT *
    FROM mytable
    WHERE ParentID IS NULL
    UNION ALL
    SELECT m.*
    FROM mytable m
    JOIN q ON m.parentID = q.PersonID
)
SELECT *
FROM q;</code>
登录后复制

此查询定义递归 CTE,q。 初始的 SELECT 语句标识根节点(ParentID 为 NULL 的根节点)。 UNION ALL 将其与后续的 SELECT 语句结合起来,这些语句递归地将 CTE 与 mytable 连接起来以包含所有后代。最后的 SELECT 语句检索完整的分层数据集。

维持等级秩序

为了保留原始的层次结构和顺序,需要修改查询:

<code class="language-sql">WITH q AS (
    SELECT m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
    FROM mytable m
    WHERE ParentID IS NULL
    UNION ALL
    SELECT m.*, q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
    FROM mytable m
    JOIN q ON m.parentID = q.PersonID
)
SELECT *
FROM q
ORDER BY bc;</code>
登录后复制

此增强型查询添加了 bc 列,使用 ROW_NUMBER() 分配唯一标识符,从而维护层次结构每个级别内的顺序。 ORDER BY bc 子句确保最终结果反映原始树结构。 调整 ORDER BY 函数中的 ROW_NUMBER() 子句允许自定义兄弟节点排序。

以上是如何在 SQL Server 中执行递归自连接来探索分层数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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