树结构表递归查询在ORACLE和MSSQL中的实现方法 [续]
2009-04-30 15:58
781 查看
上文中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表中的记录是动态增加的,如果写静态的值,这个循环就会变成一个死循环.
根据上面的写法,我改出来根据树枝列出根
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表中的记录是动态增加的,如果写静态的值,这个循环就会变成一个死循环.
相关文章推荐
- [转]树结构表递归查询在ORACLE和MSSQL中的实现方法
- 在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现方法
- 在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现方
- Oracle递归实现树型结构两种方法
- 使用oracle 9i 里的层级查询(Hierarchical Queries)实现树状表结构的递归数据查询
- 使用oracle 9i 里的层级查询(Hierarchical Queries)实现树状表结构的递归数据查询
- 树(tree)结构表递归查询的实现方法总结
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
- 用Oracle8的层次查询生成BOM树的实现方法
- ORACLE实现存储过程返回查询结果集合的方法
- MySQL使用递归存储过程实现树状结构,实现Oracle的Connect By 功能
- php实现数据树形结构 递归方法
- Oracle查询忽略大小写的实现方法
- START WITH CONNECT BY PRIOR子句实现递归查询,主要用于查询数据中的树型结构关系[父子关系]
- Oracle 循环递归遍历树结构查询
- 结构体内可以包含自身的指针(链表实现方法)或 引用 但不可以包含自身变量即递归 (因为这样一来结构体大小就无法确定了)
- 如何在ORACLE中实现将查询结果存到一个新表中,包括表结构和查询结果?
- [MSSQL]语句查询每个分组的前N条记录的实现方法
- 有关oracle实现分页查询的方法