zoukankan      html  css  js  c++  java
  • 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就可以查询出层级了。

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

  • 相关阅读:
    linux openresty 安装(图文死磕)
    openresty lua 调试 (图文死磕)
    windows openresty 死磕:安装和启动脚本
    SpringBoot SpringCloud 热部署 热加载 热调试
    SpringCloud 亿级流量 架构演进
    Zuul 详解,带视频
    Zuul Swagger 整合
    时间序列分解-STL分解法
    ISLR系列:(4.3)模型选择 PCR & PLS
    ISLR系列:(4.2)模型选择 Ridge Regression & the Lasso
  • 原文地址:https://www.cnblogs.com/yanggb/p/11163218.html
Copyright © 2011-2022 走看看