zoukankan      html  css  js  c++  java
  • MSSQLSERVER数据库 递归查询例子

    SqlServer2005版本的Sql如下:
    比如一个表,有id和pId字段,id是主键,pid表示它的上级节点,表结构和数据:
    CREATE TABLE [aaa](
     [id] [int] NULL,
     [pid] [int] NULL,
     [name] [nchar](10)
    )
    GO
    INSERT INTO aaa VALUES(1,0,'a')
    INSERT INTO aaa VALUES(2,0,'b')
    INSERT INTO aaa VALUES(3,1,'c')
    INSERT INTO aaa VALUES(4,1,'d')
    INSERT INTO aaa VALUES(5,2,'e')
    INSERT INTO aaa VALUES(6,3,'f')
    INSERT INTO aaa VALUES(7,3,'g')
    INSERT INTO aaa VALUES(8,4,'h')
    GO

    --下面的Sql是查询出1结点的所有子结点
    with my1 as(select * from aaa where id = 1
     union all select aaa.* from my1, aaa where my1.id = aaa.pid
    )
    select * from my1

    --结果包含1这条记录,如果不想包含,可以在最后加上:where id <> 1
    --自己的理解:首先查找出根结点
    --自己的理解:接着进行联合,查找出根结点下面的所有子结点
    --自己的理解:接着还是进行联合,查找出最后一个结点下面所有的子结点,再查找出最后一个结点的上一个结点的所有子结点,以此类推下去。
    --自己的理解:假设虚拟出my1的表, 我们不停的将查询的结果 往my1的表里装
    --自己的理解:当运行到UNION ALL后面的select表后就一直在with my和UNION ALL这两句之间进行来回切换,不会再运行select * from aaa where id = 1这句


    --下面的Sql是查询出8结点的所有父结点
    with my1 as(select * from aaa where id = 8
     union all select aaa.* from my1, aaa where my1.pid = aaa.id
    )
    select * from my1;

    --下面是递归删除1结点和所有子结点的语句:
    with my1 as(select * from aaa where id = 1
       union all select aaa.* from my1, aaa where my1.id = aaa.pid
    )
    delete from aaa where exists (select id from my1 where my1.id = aaa.id)

    原文网址包括了ORALCE的递归查询例子:http://blog.csdn.net/pdn2000/article/details/6674243

  • 相关阅读:
    STM32与FPGA通信写数据出错问题解决方法
    Altium Designer 8.0不为人知的27个技巧
    modbus详尽中文资料、软件、代码
    STM32中断与NVIC概览
    FatFs读写SD卡出现FR_NO_FILESYSTEM解决方法.
    用两个低位数的DA合成高位数的DA
    4-20mA电流转换电路分析
    C语言写的俄罗斯方块
    无源RS232转RS485(转)
    稻盛和夫写的六项精进指的是什么
  • 原文地址:https://www.cnblogs.com/cxeye/p/2909155.html
Copyright © 2011-2022 走看看