sql实际应用-递归查询

Posted 先定一个可以实现的小目标

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql实际应用-递归查询相关的知识,希望对你有一定的参考价值。

1、既然要谈到sql,数据库表是必须的

 

2、数据结构

   

3、获取某个节点的所有子节点

    传统的写法(sql2000) 很麻烦,暂且就不写了

    来看看CTE的写法

CREATE PROC sp_getTreeById(@TreeId int)
AS
BEGIN
    
    WITH cteTree
        AS (SELECT *
              FROM TuziTree
              WHERE Id = @TreeId  --第一个查询作为递归的基点(锚点)
            UNION ALL
            SELECT TuziTree.*     --第二个查询作为递归成员, 下属成员的结果为空时,此递归结束。
              FROM
                   cteTree INNER JOIN TuziTree ON cteTree.Id = TuziTree.ParentId) 
        SELECT *
          FROM cteTree 
  
END

测试一下啊 

exec  sp_getTreeById  @TreeId=1001

结果

-----------------------------------------------

4、使用节点路径来做(每个节点路径都保存自身的路径和所有父节点的路径=自己和所有父节点的关联)

   

5、既然有个路径

  那么查询其所有子节点 只需要 where nodePath like \'/1001/%\'了

  这样就会简单很多,加上索引。

总结:

  如果在性能的需要上,我们可以采用按需加载,点击节点时候 才会加载其所有子节点。

  如果在变化不大的情况下,可以采用缓存 。这样的处理 可以满足很多业务需求。

  良好的表设计会给后期的开发以及需求变化 带来更多的便利。

  下次继续总结sql方面的知识,案例一切以实际工作演变而来。

 

以上是关于sql实际应用-递归查询的主要内容,如果未能解决你的问题,请参考以下文章

递归的实际业务场景之MySQL 递归查询

Microsoft SQL Server 代码片段收集

sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li

SQL Server CTE 递归查询全解

php递归查询

VBA 代码中的 MS Access SQL 查询