zoukankan      html  css  js  c++  java
  • 树结构表递归查询在ORACLE和MSSQL中的实现方法 [续]

    上文中MSSQL的数据是给定顶级对象,获取顶级下面的所有树,'

    根据上面的写法,我改出来根据树枝列出根

    ALTER function [dbo].[GetProjectTreeByProjectID1] (@id [uniqueidentifier])
    returns @t table(
        [Guid] [uniqueidentifier],
        [ProjectName] [varchar](50),
        [Remark] [varchar](100),
        [ParentProject] [uniqueidentifier],
        [Depth] [int])
    as
    begin
        insert into @t select * from BI_Project where guid = @id
        while @@rowcount > 0
            insert @t
            select a.*
            from @t as b inner join BI_Project as a on b.parentproject = a.guid and a.guid not in(select guid from @t)
       return

    end

    本人最T-SQL并不是很在行,故在此解释一下以备以后忘记时回忆, 如有错误恳请指正:

    1.ALTER function [dbo].[GetProjectTreeByProjectID1] (@id [uniqueidentifier])   --function 说明是一个MSSQL 方法
    returns @t table(      ---此处说明,此function返回的是一个下述表结构的一个表
        [Guid] [uniqueidentifier],
        [ProjectName] [varchar](50),
        [Remark] [varchar](100),
        [ParentProject] [uniqueidentifier],

        [Depth] [int])

    2. insert into @t select * from BI_Project where guid = @id

    先将当前对象插入到要返回的对象表@t中.

    3. 此部分是关键部分,分解开来说明:

      while @@rowcount > 0

            insert @t
            select a.*

            from @t as b inner join BI_Project as a on b.parentproject = a.guid and a.guid not in(select guid from @t)

       3.1 @@rowcount --应该是MSSQL 内置变量,我们每次执行完SQL之后,MSSQL会自动设置@@rowcount的值为当前执行的结果的行数.

           3.2  from @t as b inner join BI_Project --将我们[当前:说明这个零时表中的数据实动态变化的]的零时表@t(也是执行完要返回的表哦)与原表[BI_Project]连接;

           3.3 条件说明:  on b.parentproject = a.guid and a.guid not in(select guid from @t) --B的parentproject与A.主键连接,并且A中排除已存在在B中的记录.

           3.4 Q:  a.guid not in(select guid from @t) 这句可以写具体的值吗?

                 A: 不可以, 因为@t表中的记录是动态增加的,如果写静态的值,这个循环就会变成一个死循环.


           

  • 相关阅读:
    合同主体列表添加两条合同主体,返回合并支付页面,支付总弹"请选择合同主体",删除后,竟然还能支付(改合并支付页面的字段状态)
    (TODO:)下载图片,报错:warning: could not load any Objective-C class information from the dyld shared cache. This will significantly reduce the quality of type information available.
    GCD死锁 多线程
    iOS知识总结
    快速排序,冒泡排序,选择排序
    fight
    3D Touch
    Xcode 调试技巧
    右滑退出手势及隐藏导航栏存在的风险
    C语言-第5课
  • 原文地址:https://www.cnblogs.com/feinian/p/1447072.html
Copyright © 2011-2022 走看看