zoukankan      html  css  js  c++  java
  • 【SQLSERVER】递归查询算法实例

    一、递归查询

          1.结构: 递归CTE最少包含两个查询(也被称为成员)。

                    第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。

                    第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。

          2.递归结束条件:

                    第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。

          3.Sql递归的优点:

                    效率高,大量数据集下,速度比程序的查询快。

          4.递归查询的作用:

                    用来查询指定成员及其递归成员(下属所有成员,包括下属的下属)

          5.适用场景:

                    成员权限查询、等级区域查询,其他相关类似查询。

    二、实例

          数据准备:    

    /*
    test表
    ID        地区ID
    Name      地区名称 
    Main_ID   地区所属上级ID
    Sign      地区等级 例如:福建-厦门-湖里 分别是 1,2,3
    */
    SELECT     1003    ID,    '福建'    Name,    0    Main_ID,    1 Sign INTO test    union all
    SELECT     1050    ,    '福州'    ,    1003    ,    2    union all
    SELECT     1051    ,    '厦门'    ,    1003    ,    2    union ALL
    SELECT     1375    ,    '思明'    ,    1051    ,    3    union all
    SELECT     1382    ,    '海沧'    ,    1051    ,    3    union all
    SELECT     1381    ,    '湖里'    ,    1051    ,    3    union all
    SELECT     1374    ,    '集美'    ,    1051    ,    3    union all
    SELECT     1373    ,    '同安'    ,    1051    ,    3    union all
    SELECT     1380    ,    '翔安'    ,    1051    ,    3    union ALL
    SELECT     667582720122    ,    '鼓楼'    ,    1050    ,    3    union all
    SELECT     667582725528    ,    '台江'    ,    1050    ,    3    union all
    SELECT     667582729587    ,    '仓山'    ,    1050    ,    3    union all
    SELECT     667582732602    ,    '马尾'    ,    1050    ,    3    union all
    SELECT     667582735385    ,    '晋安'    ,    1050    ,    3    union all
    SELECT     667582738507    ,    '闽侯'    ,    1050    ,    3    union all
    SELECT     667582742586    ,    '连江'    ,    1050    ,    3    union all
    SELECT     667582745634    ,    '罗源'    ,    1050    ,    3    union all
    SELECT     667582748358    ,    '闽清'    ,    1050    ,    3    union all
    SELECT     667582751824    ,    '永泰'    ,    1050    ,    3    union all
    SELECT     667582755215    ,    '平潭'    ,    1050    ,    3    union all
    SELECT     667582760309    ,    '福清'    ,    1050    ,    3    union all
    SELECT     667582764565    ,    '长乐'    ,    1050    ,    3

    实例:

    /*
    查询:福建省(ID 1003)及其底下的所有地区
    */
    WITH CTE AS 
    (
    --父项
    SELECT ID,Main_ID 
    FROM test WHERE ID=1003
    UNION ALL 
    --递归结果集中的下级 
    SELECT a.ID,a.Main_ID 
    FROM test a
    INNER JOIN CTE b ON b.ID=a.Main_ID
    )
    
    SELECT a.* 
    FROM Test a
    INNER JOIN CTE t ON a.ID=t.ID

    查询结果:

  • 相关阅读:
    Java-使用IO流对大文件进行分割和分割后的合并
    Java-单向链表算法
    Java-二分查找算法
    Java-二叉树算法
    Java-对象比较器
    Android中Activity的四种开发模式
    Struts2工作原理
    C++实现单例模式
    数组中有一个数字出现的次数超过数组的一半,请找出这个数字
    c++ enum用法【转】
  • 原文地址:https://www.cnblogs.com/superfeeling/p/11651087.html
Copyright © 2011-2022 走看看