相关讨论连接:
http://expert.csdn.net/Expert/TopicView1.asp?id=1477009
原题:
表:
Tree (ID [Integer],ParentID [Integer],Remark [varchar])
INSERT INTO Tree (ID,ParentID)
SELECT 1,0
UNION ALL
SELECT 2,1
UNION ALL
SELECT 3,1
UNION ALL
SELECT 4,2
UNION ALL
SELECT 5,4
UNION ALL
SELECT 6,5
UNION ALL
SELECT 7,2
T(F1,......)
INSERT INTO T (F1)
SELECT 1
UNION ALL
SELECT 5
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 1
UNION ALL
SELECT 7
UNION ALL
SELECT 6
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 1
UNION ALL
SELECT 7
UNION ALL
SELECT 6
UNION ALL
SELECT 4
参考 Tree 表中的父子关系,"祖先"的记录数要包括所有"后代"的记录数,统计 T 表中 F1 各个取值的记录数
ID Counts
1 15
2 10
3 2
4 8
5 4
6 2
7 2
答案及简单分析:
/*
看了前几个人的答案,似乎都把问题想复杂了"游标"、"临时表"、"递归"。
"游标"、"临时表" 完全可以不用!
"递归" 思想当然应是解决树型结构的该想到的方法!
但是 T-SQL 的嵌套层次最多只能到 32!
icevi(按钮工厂) 的建议是非常值得提倡的,尽管 ID,ParentID 对于仅存储是足够经济的,
但是若用其提供表现形式,性能的确不会太好!
许多高效的树型结构论坛也确实是存储并维护各个节点的层次信息的数据,这样
显示起来仅需一条 SQL 即可!
下面是我的参考答案,两个自定义函数功能几乎一样,都是运算出前面所提的,
应最好主动维护的"层次信息":
方法一: UDF 递归实现! 有 32 层嵌套限制
*/
alter FUNCTION dbo.Get32Ancestors
(@X integer)
RETURNS VARCHAR(250)
AS
BEGIN
DECLARE @ID integer
DECLARE @ReturnValue VARCHAR(250)
SELECT TOP 1 @ID = ParentID
FROM tree
WHERE [id] = @X
IF @ID <> @X
BEGIN
SELECT @ReturnValue = cast(ISNULL(dbo.Get32Ancestors(@ID),'') as varchar) + '-'+ cast(@X as varchar)
END
ELSE SET @ReturnValue = @ID
RETURN @ReturnValue
END
go
/*
2003-3-5
方法二: 无任何限制,若层次太深,效率当然不会高(好像也没更好的办法)
改进了一下:
1.正常节点均从0显示! 0-1-3
2.断码 显示 -7-8-9-10
3.GetAllAncestors(不存在的节点)返回NULL
4.GetAllAncestors(根节点)返回 0-自己
5.死循环点显示: 4-5-6-4-8
*/
alter function GetAllAncestors (@X integer)
returns varchar(1000)
as
begin
declare @ReturnValue varchar(1000)
declare @ID integer
declare @ParentID integer
set @ID = -1
select top 1 @ID=isnull([ID],0),@ParentID = isnull([ParentID],0)
from tree
where ID = @X
while @id <> @parentid and @parentid <> 0 and @ID >0
and '-' + isnull(@ReturnValue,'') +'-' not like '%-' + cast(@id as varchar) + '-%'
begin
if @ReturnValue is not null
set @ReturnValue = '-' + @ReturnValue
set @ReturnValue= cast(@id as varchar) + isnull(@ReturnValue,'')
set @id = -1
select top 1 @ID=isnull([ID],0),@ParentID = isnull([ParentID],0)
from tree
where ID = @parentid
end
set @ReturnValue = '-' + @ReturnValue
if @id>0
set @ReturnValue = cast(@id as varchar) + isnull(@ReturnValue,'')
if @parentid =0 or @id = @parentid
set @ReturnValue = '0-' + isnull(@ReturnValue,'')
return(@ReturnValue)
--select dbo.GetAllAncestors(10)
end
go
/*
方法一是"高手"的惯性思维把简单的问题搞复杂了,"太累"!
方法二是思路简单清晰,不但是"菜鸟"首选,"高手"也应反思!
若是本题分为两问:
1.求各节点层次信息
2.求属各节点含后代的记录数
可能大家就会受到一些启发!
函数定义完,下面就应该和 icevi(按钮工厂) 同志的答案异曲同工、不谋而和了
*/
select id,dbo.GetAllAncestors(id)
,(select count(*)
from T
where '-' + dbo.GetAllAncestors(f1) + '-' like '%-' + cast(tree.id as varchar) + '-%')
from tree
select id,dbo.Get32Ancestors(id)
,(select count(*)
from T
where '-' + dbo.Get32Ancestors(f1) + '-' like '%-' + cast(tree.id as varchar) + '-%')
from tree
/*
另外还要说一下封装的程度的问题,具体情况具体分析,
本题就不适合定义函数直接得到最终结果!
以上答案仅供参考!!
欢迎继续参与讨论!
*/
分享到:
相关推荐
tre 创建文件树型结构展示
js做的树型结构,应该是很好的,javascript作的树型结构javascript作的树型结构javascript作的树型结构javascript作的树型结构javascript作的树型结构javascript作的树型结构javascript作的树型结构javascript作的树型...
易语言源码树型框读出EDB数据库.rar 易语言源码树型框读出EDB数据库.rar 易语言源码树型框读出EDB数据库.rar 易语言源码树型框读出EDB数据库.rar 易语言源码树型框读出EDB数据库.rar 易语言源码树型框读出EDB...
易语言源码易语言设置树型框连线颜色.rar 易语言源码易语言设置树型框连线颜色.rar 易语言源码易语言设置树型框连线颜色.rar 易语言源码易语言设置树型框连线颜色.rar 易语言源码易语言设置树型框连线颜色.rar ...
针对这些问题,提出一种将树型结构——Baton树应用于高维数据检索的方法,操作简单,无须降维,且支持范围查询。经过实验证明,查询的时间复杂度达到O(log2n),与Baton树在检索一维数据时的效率相同。树型结构可以...
树型结构算法树型结构算法树型结构算法树型结构算法
pb9 用datawindow 实现 treeview 树型结构
易语言Access版本易语言树型框无限分级.rar 易语言Access版本易语言树型框无限分级.rar 易语言Access版本易语言树型框无限分级.rar 易语言Access版本易语言树型框无限分级.rar 易语言Access版本易语言树型框无限...
易语言源码易语言简单树型框分割文本源码.rar 易语言源码易语言简单树型框分割文本源码.rar 易语言源码易语言简单树型框分割文本源码.rar 易语言源码易语言简单树型框分割文本源码.rar 易语言源码易语言简单树型...
刚入门级别.C#树型控件的练习使用.
树型菜单,点击加号时,可以伸展出去,再点一下,可以收回.
树型结构的存储文件 VB源码......
可以计算出具有层次关系的树型结构表中所有父项目对应的金额, 只需要输入最底层项目的数据即可.表中的"Bh"字段的值必须具有层次关系. 任意层次都可以计算。 事例数据库Access为:test.mdb,表为:test。运行时请修改...
第2章至第6章分别讨论了线性表、栈和队列、串和数组、树型结构和图结构等常用的数据结构及其应用,以及在.NET框架中相应的数据结构;第7、8两章分别讨论了排序和查找常用的各种方法及其应用以及在.NET框架中相应的...
一次性填充树型框.rar 一次性填充树型框.rar 一次性填充树型框.rar 一次性填充树型框.rar 一次性填充树型框.rar 一次性填充树型框.rar
#资源达人分享计划#
树型结构论坛.rar
javascript作的树型结构javascript作的树型结构javascript作的树型结构
delphi7 树型控件 自动根据数据集生成树型结构
简单树型结构 js 用html .可以做任何动态页面(jsp asp php)