• 通过数据库编程进行递归(SQL Server)


     

    一、用于测试数据及其结构和生成该测试数据的sql语句如下:
    1、测试数据

    nodeId     parentId
    ---------- ----------
    A01        A
    A02        A
    A03        A
    A0101      A01
    A0102      A01
    A0201      A02
    A0202      A02
    B01        B
    B02        B
    B0201      B02
    B0202      B02
    B020101    B0201
    B020102    B0201

    2、建表及生成数据的sql语句
    create table tree
    (
     nodeId varchar(50) not null,
     parentId varchar(50) not null
    );

    insert into tree
    select 'A01', 'A' union all
    select 'A02', 'A' union all
    select 'A03', 'A' union all
    select 'A0101', 'A01' union all
    select 'A0102', 'A01' union all
    select 'A0201', 'A02' union all
    select 'A0202', 'A02' union all
    select 'B01', 'B' union all
    select 'B02', 'B' union all
    select 'B0201', 'B02' union all
    select 'B0202', 'B02' union all
    select 'B020101', 'B0201' union all
    select 'B020102', 'B0201'

    3、递归
    3.1 sql server 2000 环境(由于sql server 2000不支持common table expression,因此需要写一函数来递归)
    3.1.1 递归函数 [dbo].[func_get_children]

    create function [dbo].[func_get_children](@parentId varchar(50))
    returns  @t table(parentId varchar(50), nodeId varchar(50), nodeLevel int)
    as
     begin
      declare @i int
      set @i = 1;
     
      insert into @t(parentid, nodeId, nodeLevel)
      select parentId, nodeId, @i
      from tree
      where parentId = @parentId;

      while @@rowcount > 0
       begin
        set @i = @i + 1;

        insert into @t(parentid, nodeId, nodeLevel)
        select b.parentId, b.nodeId, @i
        from @t a
        inner join tree b on a.nodeId = b.parentId
        where a.nodeLevel = @i - 1;
       end
      
      return;
     end

    3.1.2 调用该函数
    select * from get_children('B');

    3.1.3 执行结果
    parentId   nodeId     nodeLevel
    ---------- ---------- -----------
    B          B01        1
    B          B02        1
    B02        B0201      2
    B02        B0202      2
    B0201      B020101    3
    B0201      B020102    3

    3.2 sql server 2005 环境
    3.2.1 递归sql
    declare @parentId varchar(10)
    set @parentId = 'b02';

    with children as
    (
     select parentId, nodeId
     from tree
     where parentId = @parentId

     union all
     
     select a.parentId, a.nodeId
     from tree a
     inner join sons b on a.parentId = b.nodeId 
    )
    select * from children;

    3.2.2 执行结果
    parentId   nodeId
    ---------- ----------
    B02        B0201
    B02        B0202
    B0201      B020101
    B0201      B020102

  • 相关阅读:
    LeetCode -- 合并区间
    windows + PyCharm安装第三方库libsvm失败的解决方案
    LeetCode--在排序数组中查找元素的第一个和最后一个位置
    LeetCode--搜索旋转排序数组
    LeetCode--单词拆分
    LeetCode--合并K个有序链表
    LeetCode--括号生成
    2015.12.21日官方最新公告!中国骇客云安全响应平台正式上线啦!
    尊敬的朋友们大家好,最新公告!寒龙联盟上线了。
    中国寒龙出品,易语言病毒之末日毁灭杀毒病毒源码,欢迎分享订阅我们的网站,我们会及时发布相关教学的。
  • 原文地址:https://www.cnblogs.com/aspsmile/p/1260737.html
Copyright © 2020-2023  润新知