sql server使用cte递归查询获取树形的父节点/子节点

Posted 彩虹の你

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server使用cte递归查询获取树形的父节点/子节点相关的知识,希望对你有一定的参考价值。

从SQL Server2005开始,可以直接通过CTE来支持递归查询。CTE(Common Table Expression,公用表表达式)是一个在查询中定义的临时命名结果集,这个结果集可以被后面紧跟着的from子句使用。每个CTE仅能被定义一次,但是在其作用域内可以被引用多次,并且在该查询生命周期中一直生存,因此可以使用CTE来执行递归操作。

假设有一个cb表,表中有id、pid和name三个字段,其中pid是其父节点的id,如果是顶级节点,则pid为null。

表中有三条记录:

id pid name
001   顶级/一级节点
001001 001 二级节点
001001001 001001 三级节点

通过子节点递归查询父节点:

with subqry(id, pid, name) as (
        select cb.id,
            cb.pid,
            cb.name
from cb where cb.id = 001001001    union all    select cb.id, cb.pid, cb.name
     from cb, subqry where cb.id = subqry.pid ) select distinct * from subqry

这样,就能查询出id为001001001的子节点及其上所有父节点。

通过父节点递归查询子节点:

with subqry(id, pid, name) as (
        select cb.id,
            cb.pid,
            cb.name
        from cb
        where cb.id = 001
  
        union all
  
        select cb.id,
            cb.pid,
            cb.name
        from cb, subqry
        where cb.pid = subqry.id
)
select distinct *
from subqry

这样,就能查询出id为001的父节点及其下所有子节点。

另外的,在向下查询子节点的时候还有一个技巧可以查询出层级。因为递归的原因,每一次递归层级就加1,就可以加一个初始值为0的层级字段level,每次递归加1就可以查询出层级了。

 

"世界是真的,付出的都值得。"

以上是关于sql server使用cte递归查询获取树形的父节点/子节点的主要内容,如果未能解决你的问题,请参考以下文章

Presto SQL 是不是像 SQL Server 一样支持使用 CTE 进行递归查询?例如员工等级

SQL Server 公用表表达式(CTE)实现递归

SQL Server 公用表表达式(CTE)实现递归

SQL Server CTE 和递归示例

sqlserver实现树形结构递归查询(无限极分类)

SqlServer :实现树形结构递归查询(无限极分类)