求一算法

zy911 2014-08-22 09:18:35
今有数据库中一表名称为class,有id数值型,name字符型,upperid数值型三列数据,表中数据组成树状结构(类似windows资源管理器),其中id列代表是自身节点,upperid代表此节点上层节点,求一算法,选择任意id可以列出此id节点下的所有节点,这些节点是最终节点,以下没有子节点,将这些节点列出来
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zy911 2014-08-22
  • 打赏
  • 举报
回复
ok,谢了,测试成功
chenglongwei 2014-08-22
  • 打赏
  • 举报
回复
是只列出来选中节点下面的最末级节点还是把选中节点下面的所有级的节点都列出来?
Tiger_Zhao 2014-08-22
  • 打赏
  • 举报
回复
SELECT *
INTO #T
FROM class
WHERE id=123

WHILE (@@ROWCOUNT<>0)
BEGIN
INSERT INTO #T
SELECT c.*
FROM class c
JOIN #T t1 ON t1.id = c.upperid
WHERE NOT EXISTS (SELECT *
FROM #T t2
WHERE t2.id = c.id)
END

--全体叶节点
SELECT *
FROM #T
WHERE NOT EXISTS (SELECT *
FROM #T t0
WHERE t0.upperid = #T.id)
zy911 2014-08-22
  • 打赏
  • 举报
回复
怎么写,选择的当前节点层数不固定,子节点数也不固定,相当于windows资源浏览器中选择一个文件夹,当前文件夹中的子文件夹中可以有任意层数的子文件夹,并且子文件夹中可以有文件,也可以没有,我需要这个文件夹中的所有文件都列出来
唐诗三百首 2014-08-22
  • 打赏
  • 举报
回复
引用 4 楼 zy911 的回复:
悲剧是数据库版本是sqlserver2000

SQL2000,建临时表,用循环写入..
zy911 2014-08-22
  • 打赏
  • 举报
回复
悲剧是数据库版本是sqlserver2000
walkeeper 2014-08-22
  • 打赏
  • 举报
回复
用CTE去递归遍历节点吧,这个用法还是挺常见的了。
--小F-- 2014-08-22
  • 打赏
  • 举报
回复
;with f as
(
select * from class where id='xx'
union all 
select a.* from class as a join f as b on a.id=b.upperid)

select * from f
唐诗三百首 2014-08-22
  • 打赏
  • 举报
回复
如果是SQL2005及以上版本,用cte递归展开. 如果是SQL2000,建临时表,用循环写入.. PS: 建议baidu/google一下,参考BOM展开的算法

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧