首页 > 数据库 > mysql教程 > 如何在SQL Server中执行递归自连接来遍历层次结构数据?

如何在SQL Server中执行递归自连接来遍历层次结构数据?

Susan Sarandon
发布: 2025-01-17 15:41:09
原创
202 人浏览过

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

SQL Server递归自连接:一种简易方法

在数据库管理中,递归自连接是一种允许表多次自连接的技术,能够遍历层次数据。在SQL Server中,这可以通过递归查询来实现。

考虑以下场景:我们有一个名为“Person”的表,包含以下列:

<code>PersonID | Initials | ParentID</code>
登录后复制

该表表示一个层次结构,其中每个人都有一个“Initials”列,并且可能有一个“ParentID”引用另一个人。

要对“Person”表执行递归自连接,我们可以使用如下所示的公用表表达式(CTE):

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

在这个CTE中:

  1. 初始查询选择“ParentID”为NULL的“Person”表中的所有行,代表最终祖先。
  2. CTE的递归部分选择“ParentID”与“q” CTE中的“PersonID”匹配的“Person”表中的行。此步骤有效地扩展了层次结构。
  3. 最终查询选择“q” CTE中的所有行,提供层次数据。

为了保持树的顺序,可以在递归查询中添加排序条件,如下所示:

<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    Person 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    Person m
    JOIN    q
    ON      m.parentID = q.PersonID
)
SELECT  *
FROM    q
ORDER BY
        bc</code>
登录后复制

通过更改ORDER BY条件,您可以控制层次结构中同级元素的排序。

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

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